1

例えば

EnterCriticalSection ( cs );
LeaveCriticalSection ( cs );

関数呼び出しを呼び出すか、オブジェクトを離れると、それをロックして解放する関数を作成したいと考えています。

クラスのワークアウトを開始するにはどうすればよいですか?

4

2 に答える 2

2

では、スコープ付きの 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 ミューテックスを検討してください。

于 2011-04-13T08:48:38.993 に答える
1

Mutexパブリック関数acquireを使用してクリティカル セクションをクラスにラップし、構築時にミューテックスを取得して破棄時に解放するrelease2 番目のクラスを呼び出すことができます。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 に答える