多线程专题之线程同步(1)

来源:互联网 发布:乒乓球知乎 编辑:程序博客网 时间:2024/06/03 18:55

#include "afxmt.h"   //使用同步类的头文件

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);