CRITICAL_SECTION cs;
   InitializeCriticalSection(&m_currenttasklock);//初始化
   DeleteCriticalSection(&m_currenttasklock);//删除
   EnterCriticalSection(&cs);//加锁
   LeaveCriticalSection(&cs);//解锁临界区要用到上面4个函数。我现在有一个类,类里面有一个静态的成员,所以类的所有对象都共用这个静态成员。类的对象分别在不同的线程中使用,所以这个共用的静态成员必须互斥访问。我在类中又添加了一个static CRITICAL_SECTION cs静态成员用于互斥。现在问题来了,我在什么地方初始化InitializeCriticalSection和删除DeleteCriticalSection这个静态成员呢?(不能使用MFC的东西)互斥多线程临界区

解决方案 »

  1.   

    定义一个static BOOL变量s_bInit,并在类外初始化BOOL CXX::s_bInit=FALSE;在类CXX的构造函数中:
    if(!s_bInit)
    {
       InitializeCriticalSection(&m_currenttasklock);
       s_bInit=TRUE;
    }
      

  2.   

    楼上的方法,并不是完全可靠的,因为s_bInit这个变量在程序中没有互斥访问,所以有可能出现两次调用 InitializeCriticalSection(&m_currenttasklock)函数的;
    我现在的方法是把m_currenttasklock作为全局变量,在程序刚开始启动的时候来初始化一次,至于释放临界区就在程序将要退出的时候调用一次
      

  3.   

    做个嵌套静态类专门用来初始化class CYourClass
    {public: class CSInitializer {
    public:
    CRITICAL_SECTION* _pCS; 
     CSInitializer(CRITICAL_SECTION *pCS)  {  ::InitializeCriticalSection(_pCS=pCS); }
     ~CSInitializer() { :: DeleteCriticalSection(_pCS); _pCS=NULL;}
    };
    static CSInitializer s_initilizer;
    static CRITICAL_SECTION s_cs;
    };CRITICAL_SECTION CYourClass::s_cs;
    CYourClass::CSInitializer CYourClass::s_initilizer = &CYourClass::s_cs;