その関数で以前に取得したロックを解放せずに関数を離れることができる場合、gcc が警告するように、ロックを取得および解放するためのマクロのペアを作成する方法はありますか?
4 に答える
開始マクロで初期化せずに変数を宣言し、終了マクロで初期化+使用することができます。gcc で適切な設定を使用すると ( -Wall
?)、宣言された変数については警告されますが、初期化された変数については警告されません。
同じ関数で同じマクロ ペアを複数回使用する場合 (たとえば、2 つのロックで使用する場合)、別の変数名を指定する必要があることに注意してください。変数の宣言
関数(スコープ)に複数のreturn
ステートメントがあると仮定すると、これを行う従来の方法はありません。
もちろん C++ では問題ありません。RAII (d'tor でロックを解除する自動オブジェクト) を使用できます。
Windows 用のコードを作成する場合は、SEH ラッパーを使用してリソースを確実に解放できます。また、例外 (C++ と SEH の両方) でも正しく動作します。
__try
{
lock(/*...*/);
// ...
if (/* ... */)
return;
} __finally {
unlock(/* ... */);
}
コンパイラにそれを強制させる方法は考えられませんが、 return キーワードの代わりにいつでもマクロを使用できます。このような:
#define RETURN(x) { if (locked()) unlock(); return x; }
とは言っても、個人的にはそのようなマクロは嫌いですが、それはオプションです。
GCC は、変数がスコープ外になったときに関数を呼び出す cleanup 属性を提供します。ロック解除機能がある場合:
void unlock(lock_t *);
ロックを次のように宣言できます。
lock_t lock __attribute__((cleanup, unlock));
もちろん、C++ の方法の方が移植性が高く、理解されています。