LoginSignup
5
11

More than 5 years have passed since last update.

Windows C++で排他制御

Last updated at Posted at 2016-03-02

排他制御の種類(windows)

クリティカルセクション
ミューテックス
セマフォ
ファイル

排他制御はオブジェクト指向で!

C++ではコンストラクタとデストラクタというのがあり、これを使った排他制御が便利です。
ロックの解放忘れることもありません。
functionの中でインスタンス生成時にコンストラクタでロックし、
functionが終了すればインスタンス消滅時にデストラクタでロック解除する。
そんなプログラムを書いてみました。

基本ファイル

Lock.h

class LockObject {
public:
    LockObject() {}
    virtual ~LockObject() {}
    virtual void Lock() = 0;
    virtual void Unlock() = 0;
};
class Lock {
private:
   LockObject *pLock;
public:
   Lock(LockObject *obj) { pLock = obj; pLock->Lock(); };
   ~Lock(){ pLock->Unlock(); }
};

クリティカルセクション

CriticalLock.h

#include <windows.h>
#include "Lock.h"
class CriticalLock : public LockObject {
private:
    CRITICAL_SECTION CritSect;
public:
    CriticalLock();
    virtual ~CriticalLock();
    virtual void Lock();
    virtual void Unlock();
};
CriticalLock.cpp

CriticalLock::CriticalLock()
{
    InitializeCriticalSection(&CritSect);
}
CriticalLock::~CriticalLock()
{
    DeleteCriticalSection(&CritSect);
}
void CriticalLock::Lock(void)
{
    EnterCriticalSection(&CritSect);
}
void CriticalLock::Unlock(void)
{
    LeaveCriticalSection(&CritSect);
}
使い方

#include <windows.h>
#include <Lock.h>
CriticalLock cObj;


void hoge(){
  Lock lk(&cObj);
   
   ここは排他制御で1スレッドしか実行できません

}

その他の排他制御

CriticalLockと同じように書けば
セマフォでもミューテックスでもできると思う。
Linuxでも可能だと思います。

5
11
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
11