2011-04-13 3 views
1

を使用したmutexのようなプログラムの作成。CriticalSection

EnterCriticalSection (cs); 
LeaveCriticalSection (cs); 

私はそれをロックする関数を作成し、関数呼び出しを呼び出すかオブジェクトを残す場合は解放したいと思います。

どのようにクラスを始めることができますか?

答えて

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

またはconsider a Boost mutexです。

+0

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

このようにそれを使用しますコード。 – LumpN

+0

@ LumpN:良いスポット。修正しました。 –

1

あなたは、公共の機能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 
}; 

ロック:あなたのコンストラクタは、それがあなたに欠けている、引数として `LPCRITICAL_SECTION`を取る

Mutex someMutex; 

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

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