<1>使用互斥对象Mutex实现线程同步
- CMutex mutex; //互斥量对象
- int g_data = 0; //全局资源
- static HANDLE g_ReadHnd; //读线程句柄
- static HANDLE g_WriteHnd; //写线程句柄
- ///
- UINT ThreadProcWrite(LPVOID param) //用于写数据的线程,即第一个线程的回调函数
- {
- CEdit *pedit=(CEdit*)param;
- while(true)
- {
- CString str;
- CSingleLock singleLock(&mutex);
- singleLock.Lock();
- g_data++; //数据加1
- str.Format("%d", g_data);
- pedit->SetWindowText(str);//编辑框显示数据
- Sleep(1000); //阻塞线程一定时间
- singleLock.Unlock(); //互斥量解锁
- }
- return 0;
- }
- /
- UINT ThreadProcRead(LPVOID param) //用于读数据的线程,即第二个线程的回调函数
- {
- UINT retval;
- CEdit *pedit=(CEdit*)param;
- while(true)
- {
- CSingleLock singleLock(&mutex);
- singleLock.Lock();
- retval = g_data; //读数据
- singleLock.Unlock(); //解锁
- CString str;
- str.Format("%d", retval);
- pedit->SetWindowText(str);//编辑框显示数据
- }
- return 0;
- }
- ///
- void CMutexThreadSynDlg::OnStarw() //启动写线程
- {
- // TODO: Add your control notification handler code here
- CWinThread* pThread;
- pThread = AfxBeginThread(ThreadProcWrite, &m_WriteEdit);//开始写线程
- g_WriteHnd = pThread->m_hThread; //获取写线程句柄
- GetDlgItem(IDC_STARW)->EnableWindow(false); //启动按钮无效
- GetDlgItem(IDC_STOPW)->EnableWindow(true); //开始按钮生效
- }
- //
- void CMutexThreadSynDlg::OnStarr() //启动读线程
- {
- // TODO: Add your control notification handler code here
- CWinThread* pThread;
- pThread = AfxBeginThread(ThreadProcRead, &m_ReadEdit);//开始读线程
- g_ReadHnd = pThread->m_hThread; //获取写线程句柄
- GetDlgItem(IDC_STARR)->EnableWindow(false); //启动按钮无效
- GetDlgItem(IDC_STOPR)->EnableWindow(true); //停止按钮生效
- }
- void CMutexThreadSynDlg::OnStopr() //销毁读线程
- {
- // TODO: Add your control notification handler code here
- CSingleLock singleLock(&mutex);
- singleLock.Lock();
- TerminateThread(g_ReadHnd, 0); //终止读线程
- singleLock.Unlock(); //释放资源
- m_ReadEdit.SetWindowText("终止读线程");
- GetDlgItem(IDC_STARR)->EnableWindow(true); //启动按钮生效
- GetDlgItem(IDC_STOPR)->EnableWindow(false); //停止按钮无效
- }
- //
- void CMutexThreadSynDlg::OnStopw() //销毁写线程
- {
- // TODO: Add your control notification handler code here
- CSingleLock singleLock(&mutex);
- singleLock.Lock();
- TerminateThread(g_WriteHnd, 0); //终止写线程
- singleLock.Unlock(); //释放资源
- m_WriteEdit.SetWindowText("终止写线程");
- GetDlgItem(IDC_STARW)->EnableWindow(true); //启动按钮生效
- GetDlgItem(IDC_STOPW)->EnableWindow(false); //停止按钮无效
- }
CMutex mutex; //互斥量对象
int g_data = 0; //全局资源
static HANDLE g_ReadHnd; //读线程句柄
static HANDLE g_WriteHnd; //写线程句柄
///
UINT ThreadProcWrite(LPVOID param) //用于写数据的线程,即第一个线程的回调函数
{
CEdit *pedit=(CEdit*)param;
while(true)
{
CString str;
CSingleLock singleLock(&mutex);
singleLock.Lock();
g_data++; //数据加1
str.Format("%d", g_data);
pedit->SetWindowText(str);//编辑框显示数据
Sleep(1000); //阻塞线程一定时间
singleLock.Unlock(); //互斥量解锁
}
return 0;
}
/
UINT ThreadProcRead(LPVOID param) //用于读数据的线程,即第二个线程的回调函数
{
UINT retval;
CEdit *pedit=(CEdit*)param;
while(true)
{
CSingleLock singleLock(&mutex);
singleLock.Lock();
retval = g_data; //读数据
singleLock.Unlock(); //解锁
CString str;
str.Format("%d", retval);
pedit->SetWindowText(str);//编辑框显示数据
}
return 0;
}
///
void CMutexThreadSynDlg::OnStarw() //启动写线程
{
// TODO: Add your control notification handler code here
CWinThread* pThread;
pThread = AfxBeginThread(ThreadProcWrite, &m_WriteEdit);//开始写线程
g_WriteHnd = pThread->m_hThread; //获取写线程句柄
GetDlgItem(IDC_STARW)->EnableWindow(false); //启动按钮无效
GetDlgItem(IDC_STOPW)->EnableWindow(true); //开始按钮生效
}
//
void CMutexThreadSynDlg::OnStarr() //启动读线程
{
// TODO: Add your control notification handler code here
CWinThread* pThread;
pThread = AfxBeginThread(ThreadProcRead, &m_ReadEdit);//开始读线程
g_ReadHnd = pThread->m_hThread; //获取写线程句柄
GetDlgItem(IDC_STARR)->EnableWindow(false); //启动按钮无效
GetDlgItem(IDC_STOPR)->EnableWindow(true); //停止按钮生效
}
void CMutexThreadSynDlg::OnStopr() //销毁读线程
{
// TODO: Add your control notification handler code here
CSingleLock singleLock(&mutex);
singleLock.Lock();
TerminateThread(g_ReadHnd, 0); //终止读线程
singleLock.Unlock(); //释放资源
m_ReadEdit.SetWindowText("终止读线程");
GetDlgItem(IDC_STARR)->EnableWindow(true); //启动按钮生效
GetDlgItem(IDC_STOPR)->EnableWindow(false); //停止按钮无效
}
//
void CMutexThreadSynDlg::OnStopw() //销毁写线程
{
// TODO: Add your control notification handler code here
CSingleLock singleLock(&mutex);
singleLock.Lock();
TerminateThread(g_WriteHnd, 0); //终止写线程
singleLock.Unlock(); //释放资源
m_WriteEdit.SetWindowText("终止写线程");
GetDlgItem(IDC_STARW)->EnableWindow(true); //启动按钮生效
GetDlgItem(IDC_STOPW)->EnableWindow(false); //停止按钮无效
}
<2>使用信号量Semaphore实现线程同步
- int thread=0;
- CSemaphore mySemaphore(4,4);
- //
- UINT ThreadProc(LPVOID pParam)
- {
- CEdit* pedit=(CEdit*)pParam;
- CString str;
- thread++;
- str.Format("%d",thread);
- pedit->SetWindowText(str);
- CSingleLock singlelock(&mySemaphore);
- singlelock.Lock();
- MessageBox(NULL,"信号量控制访问资源线程数","提示",MB_ICONWARNING);
- thread--;
- str.Format("%d",thread);
- pedit->SetWindowText(str);
- return 0;
- }
- void CSemaphoreThreadSynDlg::OnCreateThread()
- {
- // TODO: Add your control notification handler code here
- CWinThread* pThread=AfxBeginThread(ThreadProc,&m_Edit);
- }
int thread=0;
CSemaphore mySemaphore(4,4);
//
UINT ThreadProc(LPVOID pParam)
{
CEdit* pedit=(CEdit*)pParam;
CString str;
thread++;
str.Format("%d",thread);
pedit->SetWindowText(str);
CSingleLock singlelock(&mySemaphore);
singlelock.Lock();
MessageBox(NULL,"信号量控制访问资源线程数","提示",MB_ICONWARNING);
thread--;
str.Format("%d",thread);
pedit->SetWindowText(str);
return 0;
}
void CSemaphoreThreadSynDlg::OnCreateThread()
{
// TODO: Add your control notification handler code here
CWinThread* pThread=AfxBeginThread(ThreadProc,&m_Edit);
}
<3>使用临界区对象CritialSection实现线程同步
- CCriticalSection g_cs; //临界区对象
- int g_data = 0; //全局资源
- static HANDLE g_ReadHnd;//读线程句柄
- static HANDLE g_WriteHnd;//写线程句柄
- /
- UINT ThreadProcWrite(LPVOID param) //用于写数据的线程,即第一个线程的回调函数
- {
- CEdit *pedit=(CEdit*)param;
- while(true)
- {
- CString str;
- g_cs.Lock(); //临界区锁定共享资源
- g_data++; //数据加1
- str.Format("%d", g_data);
- pedit->SetWindowText(str);//编辑框显示数据
- Sleep(1000); //阻塞线程一定时间
- g_cs.Unlock(); //临界区解锁
- }
- return 0;
- }
- //
- UINT ThreadProcRead(LPVOID param) //用于读数据的线程,即第二个线程的回调函数
- {
- UINT retval;
- CEdit *pedit=(CEdit*)param;
- while(true)
- {
- g_cs.Lock(); //锁定共享资源
- retval = g_data; //读数据
- g_cs.Unlock(); //解锁
- CString str;
- str.Format("%d", retval);
- pedit->SetWindowText(str);//编辑框显示数据
- }
- return 0;
- }
- void CCriticalSecitonThreadSynDlg::OnStarw() //启动写线程
- {
- // TODO: Add your control notification handler code here
- CWinThread* pThread;
- pThread = AfxBeginThread(ThreadProcWrite, &m_WriteEdit);//开始写线程
- g_WriteHnd = pThread->m_hThread;//获取写线程句柄
- GetDlgItem(IDC_STARW)->EnableWindow(false);//启动按钮无效
- GetDlgItem(IDC_STOPW)->EnableWindow(true);//开始按钮生效
- }
- ///
- void CCriticalSecitonThreadSynDlg::OnStopr() //销毁读线程
- {
- // TODO: Add your control notification handler code here
- g_cs.Lock();//锁定资源
- TerminateThread(g_ReadHnd, 0);//终止读线程
- g_cs.Unlock();//释放资源
- m_ReadEdit.SetWindowText("终止读线程");
- GetDlgItem(IDC_STARR)->EnableWindow(true);//启动按钮生效
- GetDlgItem(IDC_STOPR)->EnableWindow(false);//停止按钮无效
- }
- //
- void CCriticalSecitonThreadSynDlg::OnStopw() //销毁写线程
- {
- // TODO: Add your control notification handler code here
- g_cs.Lock();//锁定资源
- TerminateThread(g_WriteHnd, 0);//终止写线程
- g_cs.Unlock();//释放资源
- m_WriteEdit.SetWindowText("终止写线程");
- GetDlgItem(IDC_STARW)->EnableWindow(true);//启动按钮生效
- GetDlgItem(IDC_STOPW)->EnableWindow(false);//停止按钮无效
- }
- ///
- void CCriticalSecitonThreadSynDlg::OnStarr() //启动读线程
- {
- // TODO: Add your control notification handler code here
- CWinThread* pThread;
- pThread = AfxBeginThread(ThreadProcRead, &m_ReadEdit);//开始读线程
- g_ReadHnd = pThread->m_hThread;//获取写线程句柄
- GetDlgItem(IDC_STARR)->EnableWindow(false);//启动按钮无效
- GetDlgItem(IDC_STOPR)->EnableWindow(true);//停止按钮生效
- }
CCriticalSection g_cs; //临界区对象
int g_data = 0; //全局资源
static HANDLE g_ReadHnd;//读线程句柄
static HANDLE g_WriteHnd;//写线程句柄
/
UINT ThreadProcWrite(LPVOID param) //用于写数据的线程,即第一个线程的回调函数
{
CEdit *pedit=(CEdit*)param;
while(true)
{
CString str;
g_cs.Lock(); //临界区锁定共享资源
g_data++; //数据加1
str.Format("%d", g_data);
pedit->SetWindowText(str);//编辑框显示数据
Sleep(1000); //阻塞线程一定时间
g_cs.Unlock(); //临界区解锁
}
return 0;
}
//
UINT ThreadProcRead(LPVOID param) //用于读数据的线程,即第二个线程的回调函数
{
UINT retval;
CEdit *pedit=(CEdit*)param;
while(true)
{
g_cs.Lock(); //锁定共享资源
retval = g_data; //读数据
g_cs.Unlock(); //解锁
CString str;
str.Format("%d", retval);
pedit->SetWindowText(str);//编辑框显示数据
}
return 0;
}
void CCriticalSecitonThreadSynDlg::OnStarw() //启动写线程
{
// TODO: Add your control notification handler code here
CWinThread* pThread;
pThread = AfxBeginThread(ThreadProcWrite, &m_WriteEdit);//开始写线程
g_WriteHnd = pThread->m_hThread;//获取写线程句柄
GetDlgItem(IDC_STARW)->EnableWindow(false);//启动按钮无效
GetDlgItem(IDC_STOPW)->EnableWindow(true);//开始按钮生效
}
///
void CCriticalSecitonThreadSynDlg::OnStopr() //销毁读线程
{
// TODO: Add your control notification handler code here
g_cs.Lock();//锁定资源
TerminateThread(g_ReadHnd, 0);//终止读线程
g_cs.Unlock();//释放资源
m_ReadEdit.SetWindowText("终止读线程");
GetDlgItem(IDC_STARR)->EnableWindow(true);//启动按钮生效
GetDlgItem(IDC_STOPR)->EnableWindow(false);//停止按钮无效
}
//
void CCriticalSecitonThreadSynDlg::OnStopw() //销毁写线程
{
// TODO: Add your control notification handler code here
g_cs.Lock();//锁定资源
TerminateThread(g_WriteHnd, 0);//终止写线程
g_cs.Unlock();//释放资源
m_WriteEdit.SetWindowText("终止写线程");
GetDlgItem(IDC_STARW)->EnableWindow(true);//启动按钮生效
GetDlgItem(IDC_STOPW)->EnableWindow(false);//停止按钮无效
}
///
void CCriticalSecitonThreadSynDlg::OnStarr() //启动读线程
{
// TODO: Add your control notification handler code here
CWinThread* pThread;
pThread = AfxBeginThread(ThreadProcRead, &m_ReadEdit);//开始读线程
g_ReadHnd = pThread->m_hThread;//获取写线程句柄
GetDlgItem(IDC_STARR)->EnableWindow(false);//启动按钮无效
GetDlgItem(IDC_STOPR)->EnableWindow(true);//停止按钮生效
}
<4>使用CEvent对象实现线程同步
- CEvent g_Event;
- char g_str[]="how to use the CEvent synchronization classes";
- ///
- UINT ThreadFun(LPVOID pParam)
- {
- WaitForSingleObject(g_Event.m_hObject,INFINITE);
- CWnd* pMainWnd=AfxGetMainWnd();
- if(NULL==pParam)
- {
- AfxMessageBox("参数传递出错,线程中止!",MB_OK|MB_ICONERROR);
- AfxEndThread(2); /
- }
- char* pString=(char*)pParam;
- while(*pString)
- {
- if(*pString>='a'&&*pString<='z')
- {
- *pString-=32;
- }
- pString++;
- }
- g_Event.SetEvent();
- return 0;
- }
- /
- void CEventThreadSynDlg::OnEvent()
- {
- // TODO: Add your control notification handler code here
- GetDlgItem(IDC_EVENT)->EnableWindow(FALSE);
- char* temp=(char*)g_str;
- int i=0;
- g_Event.SetEvent();
- WaitForSingleObject(g_Event.m_hObject,INFINITE);
- while(*temp)
- {
- if(i==5)
- {
- char* pStr=g_str;
- AfxBeginThread(ThreadFun,(LPVOID)pStr);
- }
- if(i==7)
- {
- g_str[i]='7';
- }
- Sleep(10);
- temp++;
- i++;
- }
- GetDlgItem(IDC_EDIT1)->SetWindowText(CString(g_str));
- g_Event.SetEvent();
- WaitForSingleObject(g_Event.m_hObject,INFINITE);
- GetDlgItem(IDC_EDIT2)->SetWindowText(CString(g_str));
- }
转自:http://blog.youkuaiyun.com/themagickeyjianan/article/details/9390985