Создание мьютекс-подобной программы с использованием CriticalSection - PullRequest
1 голос
/ 13 апреля 2011

1001 *, например *

EnterCriticalSection ( cs );
LeaveCriticalSection ( cs );

Я хочу создать функцию, блокирующую ее, и освободить, если вызову функции вызов или выход из объекта.

Как начать тренироваться в классе?

Ответы [ 2 ]

2 голосов
/ 13 апреля 2011

Значит, область действия 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! */
}

Или рассмотрим буст-мьютекс .

1 голос
/ 13 апреля 2011

Вы можете обернуть критическую секцию в классе Mutex открытыми функциями acquire и release и иметь второй класс с именем 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
}
...