LoginSignup
1
2

More than 5 years have passed since last update.

CRITICAL_SECTION用のマクロ

Last updated at Posted at 2016-09-02

C++とC#をウロウロしてて、ふと

hoge.cpp
// 排他制御したいところ
EnterCriticalSection(&CS);
...
LeaveCriticalSection(&CS);

って、毎度書くのは面倒だなぁと思って
C#のlock()構文みたいなマクロを作ってみた
コーディングルール的にめっちゃ怒られそうなやつ

piyo.cpp
// マクロ定義
#define lock(x) for(char _z = (EnterCriticalSection(&x), 1); _z; _z = (LeaveCriticalSection(&x), 0))

// 排他制御したいところ
lock(CS)
{
    ...
}

for文の中で定義している変数char _zは、他のと被らないように適当な名前が良いし
もちろんint型でもbool型でも何でも良いです。

無理矢理ポイント
1.変数_zを定義して、ループが1回だけ実行されるような無駄ループを組んでいる
2.カンマ演算子を使用して、Enter/Leave関数をぶち込んでいる

マクロ的にはただのfor文なので、1行lockも大丈夫

fuga.cpp
// 排他制御したいところ
lock(CS)
    ....

記述側でbreakとかreturnとかされると当然ロック解除されないので、脆弱性が脆くて弱いという性質があります。

結論:std::mutex使おう。

1
2
2

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
1
2