CMutex、CCriticalSection、CSemaphore、CEvent、WaitForSingleObject 的小例子

一、CMutex

CMutex mutex;
mutex.Lock();
//
互斥的动作
//
mutex.Unlock();

 

二、CCriticalSection

CCriticalSection g_thCurLock;
g_thCurLock.Lock();
//
临界区
//
g_thCurLock.Unlock();

 

三、CSemaphore

信号量对象的成员函数Lock()将计数器的值 -1,当计数器为0时,就不再允许其他线程访问该资源;而当一个线程使用信号量对象的成员函数Unlock()释放资源时,可以将计数器的值 +1。

因此,信号量对象允许多个线程访问同一个资源,但同时访问该资源的线程总数不能超过信号量对象的最大计数值。

原型:

CSemaphore( 
    LONG lInitialCount /* = 1 */,    //计数器的初始值 
    LONG lMaxCount /* = 1 */,        //计数器的最大计数值 
    LPCTSTR pstrName/* =NULL */,        //信号的名称 
    LPSECURITY_ATTRIBUTES lpsaAttributes /* = NULL */    //指向一个SECURITY_ATTRIBUTES结构的指针 
) 
CSemaphore semaphoreObj(2,3); 
semaphoreObj.Lock(); 
//
访问资源
//
semaphoreObj.Unlock(); 

 

四、CEvent、WaitForSingleObject

 

#include "afxmt.h"
//定义事件对象和一个字符数组,为了能够在不同线程间使用,定义为全局变量。

CEvent eventWriteD;
char g_Array[10];

//添加线程函数:
UINT WriteW(LPVOID pParam)
{
 CEdit *pEdit=(CEdit*)pParam;
 pEdit->SetWindowText("");
 for(int i=0;i<10;i++)
 {
  g_Array[i]=''W'';
      pEdit->SetWindowText(g_Array);
  Sleep(1000);
 }
 eventWriteD.SetEvent();
 return 0;

}

UINT WriteD(LPVOID pParam)
{
 CEdit *pEdit=(CEdit*)pParam;
 pEdit->SetWindowText("");
 WaitForSingleObject(eventWriteD.m_hObject,INFINITE);
 for(int i=0;i<10;i++)
 {
  g_Array[i]=''D'';
      pEdit->SetWindowText(g_Array);
  Sleep(1000);
 }
 return 0;

}

线程 WiteD 执行到 WaitForSingleObject(eventWriteD.m_hObject,INFINITE) 处等待。
直到执行eventWiteD.SetEvent()后,eventWiteD 为有信号时,该线程才继续往下执行。
因为 eventWriteD 对象是自动事件,当 WriteForSingleObject() 返回时,系统自动把 eventWriteD 对象重置为无信号状态

如果不是用的 CEvent,而是用 CreateEvent() 创建的事件

原型:
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTESlpEventAttributes,// 安全属性
BOOLbManualReset,// 复位方式
BOOLbInitialState,// 初始状态
LPCTSTRlpName // 对象名称
);

一个Event被 CreateEvent() 创建以后,可以用 OpenEvent() API来获得它的Handle,用 CloseHandle() 来关闭它,用 SetEvent() 或 PulseEvent() 来设置它使其有信号,用 ResetEvent() 来使其无信号,用 WaitForSingleObject() 或 WaitForMultipleObjects() 来等待其变为有信号。

 

posted @ 2017-05-12 15:35  那一剑的風情  阅读(1110)  评论(0编辑  收藏  举报