1

例如

EnterCriticalSection ( cs );
LeaveCriticalSection ( cs );

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

如何开始上课?

4

2 回答 2

2

所以一个范围的关键部分?

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 mutex

于 2011-04-13T08:48:38.993 回答
1

您可以将关键部分包装在Mutex具有公共函数的类中acquirerelease并让第二个类称为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
}
于 2011-04-13T09:02:22.547 回答