CCriticalSection g_CriticalSection;
//临界区对象,不可以用于进程间
CEvent g_Event1; //自动重置事件,初始无信号状态
CEvent g_Event2(TRUE); //自动重置事件,初始有信号状态
CEvent g_Event3(FALSE,TRUE); //人工重置事件,初始无信号状态
CEvent g_Event4(TRUE,TRUE); //人工重置事件,初始有信号状态
//事件也可以用用于进程间
CMutex g_Mutex;
//互斥对象,可以用于进程间
CSemaphore g_Semaphore(2/*信号量对象的初始计数值,即有多少个线程可以访问*/,
2/*信号量对象计数值的最大值,即同一时刻可访问的线程的最大数目,必须大于等于初始值*/);
//如果我们用g_Semaphore(2,2)的话,两个对话框会同时弹出。
//如果我们用g_Semaphore(2,2)的话,你会发现测试弹出对话框中。必须在你关闭前一个对话框的时候,才会弹出另一个对话框。
//信号量,可以用于进程间
static DWORD SyncThreadProc1(
LPVOID lpParameter
)
{
/*
// 临界区同步
g_CriticalSection.Lock();
AfxMessageBox( _T("SyncThreadProc1") );
g_CriticalSection.Unlock();
*/
/*
事件对象
WaitForSingleObject(g_Event1.m_hObject,INFINITE);
AfxMessageBox( _T("SyncThreadProc1") );
g_Event1.SetEvent();
WaitForSingleObject(g_Event2.m_hObject,INFINITE);
AfxMessageBox( _T("SyncThreadProc1") );
g_Event2.SetEvent();
WaitForSingleObject(g_Event3.m_hObject,INFINITE);
g_Event3.ResetEvent(); //如果不将g_Event3置为无信号状态,两个对话框将同时弹出来。
AfxMessageBox( _T("SyncThreadProc1") );
g_Event3.SetEvent();
WaitForSingleObject(g_Event4.m_hObject,INFINITE);
g_Event4.ResetEvent(); //如果不将g_Event3置为无信号状态,两个对话框将同时弹出来。
AfxMessageBox( _T("SyncThreadProc1") );
g_Event4.SetEvent();
*/
/*
// 互斥对象同步
g_Mutex.Lock();
AfxMessageBox( _T("SyncThreadProc1") );
g_Mutex.Unlock();
*/
/*
// 信号量同步
g_Semaphore.Lock();
AfxMessageBox( _T("SyncThreadProc1") );
g_Semaphore.Unlock();
*/
return 0;
}
static DWORD SyncThreadProc2(
LPVOID lpParameter
)
{
/*
// 临界区同步
g_CriticalSection.Lock();
AfxMessageBox( _T("SyncThreadProc2") );
g_CriticalSection.Unlock();
*/
/*
事件对象
WaitForSingleObject(g_Event1.m_hObject,INFINITE);
AfxMessageBox( _T("SyncThreadProc2") );
g_Event1.SetEvent();
WaitForSingleObject(g_Event2.m_hObject,INFINITE);
AfxMessageBox( _T("SyncThreadProc2") );
g_Event2.SetEvent();
WaitForSingleObject(g_Event3.m_hObject,INFINITE);
g_Event3.ResetEvent(); //如果不将g_Event3置为无信号状态,两个对话框将同时弹出来。
AfxMessageBox( _T("SyncThreadProc2") );
g_Event3.SetEvent();
WaitForSingleObject(g_Event4.m_hObject,INFINITE);
g_Event4.ResetEvent(); //如果不将g_Event3置为无信号状态,两个对话框将同时弹出来。
AfxMessageBox( _T("SyncThreadProc2") );
g_Event4.SetEvent();
*/
/*
// 互斥对象同步
g_Mutex.Lock();
AfxMessageBox( _T("SyncThreadProc2") );
g_Mutex.Unlock();
*/
/*
// 信号量同步
g_Semaphore.Lock();
AfxMessageBox( _T("SyncThreadProc2") );
g_Semaphore.Unlock();
*/
return 0;
}
void CMultiThreadDlg::OnBtnUsageSeven()
{
// TODO: Add your control notification handler code here
//使用同步对象你会发现测试弹出对话框中。
//必须在你关闭前一个对话框的时候,才会弹出另一个对话框。
//这就是同步的作用
HANDLE hThread1 = NULL;
HANDLE hThread2 = NULL;
hThread1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)SyncThreadProc1,NULL,0,NULL);
hThread2 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)SyncThreadProc2,NULL,0,NULL);
//g_Event1.SetEvent(); //g_Event1置为有信号状态,如果不这样做的话,两个线程将永远等待不到信号
//g_Event2.ResetEvent(); //g_Event2初始有信号现在置为无信号。两个线程将永远等待不到信号
//g_Event3.SetEvent(); //g_Event3置为有信号状态,如果不这样做的话,两个线程将永远等待不到信号
//g_Event4.ResetEvent(); //g_Event4初始有信号现在置为无信号。两个线程将永远等待不到信号
if ( hThread1 ) CloseHandle(hThread1);
if ( hThread2 ) CloseHandle(hThread2);