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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值