zoukankan      html  css  js  c++  java
  • 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() 来等待其变为有信号。

  • 相关阅读:
    (精华)将json数组和对象转换成List和Map(小龙哥和牛徳鹤的对话)
    优先队列底层实现是堆(heap)(操作系统进程调度)
    (透彻理解)最精锐代码::堆的三种基本操作新建-插入-删除
    (考研)读者写者问题(附代码)
    (考研)黑电吃苹果同步互斥问题(附代码)
    (考研)哲学家进餐问题(附代码)
    (考研)吸烟者问题(赋代码)
    (考研)PV操作和信号量
    01.第一章_C++ Primer学习笔记_开始
    C++学习笔记
  • 原文地址:https://www.cnblogs.com/SZxiaochun/p/6845775.html
Copyright © 2011-2022 走看看