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
使おう。