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

Creating a mutex like program using CriticalSection

本文关键字:程序 一个 创建 CriticalSection 使用      更新时间:2023-10-16

例如

EnterCriticalSection ( cs );
LeaveCriticalSection ( cs );

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

如何开始计算课程?

那么是一个作用域的CriticalSection?

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! */
}

或者考虑Boost互斥。

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

Mutex:

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
}
相关文章: