使用 CriticalSection 创建类似互斥锁的程序

Posted

技术标签:

【中文标题】使用 CriticalSection 创建类似互斥锁的程序【英文标题】:Creating a mutex like program using CriticalSection 【发布时间】:2011-04-13 08:44:28 【问题描述】:

例如

EnterCriticalSection ( cs );
LeaveCriticalSection ( cs );

我想创建一个函数来锁定它,如果调用你的函数调用或离开对象,则释放它。

如何开始上课?

【问题讨论】:

【参考方案1】:

所以是一个作用域的关键部分?

class ScopedCriticalSection 
   CRITICAL_SECTION cs;

   ScopedCriticalSection()
   
      if (!InitializeCriticalSectionAndSpinCount(&cs, 0x00000400))
         throw std::runtime_error("Could not initialise CriticalSection object");
      EnterCriticalSection(&cs);
   

   ~ScopedCriticalSection()
   
      LeaveCriticalSection(&cs);
      DeleteCriticalSection(&cs);
   
;

void foo()

   ScopedCriticalSection scs;

   /* code! */

或consider a Boost mutex。

【讨论】:

您的构造函数将LPCRITICAL_SECTION 作为参数,但您的代码中缺少该参数。【参考方案2】:

您可以将关键部分包装在具有公共函数 acquirereleaseMutex 类中,并让第二个名为 ScopedLock 的类在构造时获取互斥锁并在销毁时释放它。

互斥体:

class Mutex 
   public:
     Mutex() 
       //TODO: create cs
     
     ~Mutex() 
       //TODO: destroy cs
     
     void acquire() 
       EnterCriticalSection(cs);
     
     void release() 
       LeaveCriticalSection(cs);
     
   private:
     LPCRITICAL_SECTION cs;
     Mutex(const Mutex&); //non-copyable
     Mutex& operator=(const Mutex&); //non-assignable
;

锁:

class ScopedLock 
  public:
    ScopedLock(Mutex* mutex_) : mutex(mutex_) 
      mutex->acquire();
    
    ~ScopedLock() 
      mutex->release();
    
  private:
    Mutex* mutex;
;

像这样使用它:

Mutex someMutex;

void foo() 
  ScopedLock lock(&someMutex);
  //critical stuff here


void bar() 
  ScopedLock lock(&someMutex);
  //other critical stuff here

【讨论】:

以上是关于使用 CriticalSection 创建类似互斥锁的程序的主要内容,如果未能解决你的问题,请参考以下文章

windows多线程 互斥量Mutex与关键段CriticalSection比较

多线程相关------临界区CriticalSection

多线程编程之Windows同步方式

OS学习笔记四:同步机制

windows多线程 事件event

进程管理-进程互斥