私は、非同期タイマーを作成するためにブーストライブラリを使用しているクロスプラットフォームのC++プログラムを使用しています。2つのスレッドが同じbool変数に同時にアクセスするとどうなりますか?
bool receivedInput = false;
1つのスレッドが他のスレッドがコールバックが10秒ごとに呼び出されるタイマーを実行するために待機し、入力
string argStr;
while (1)
{
getline(cin, argStr);
processArguments(argStr);
receivedInput = true;
}
処理:
私はグローバル変数を持っています。そのコールバックで、私はメッセージを受信したかどうかを確認します。
if (receivedInput)
{
//set up timer to fire again in 10 seconds
receivedInput = false;
}
else
exit(1);
安全ですか?スレッド2の読み込みでは、条件がtrueまたはfalseのいずれかに評価されるため、問題はないと思います。しかし、両方のスレッドが同時にreceiveInputを設定しようとするとどうなるかはわかりません。また、タイマーを入力を待つ時間よりも3倍長くして、競合状態が心配していないようにしました。
編集: これを解決するために、receivedInputとboost :: shared_lockを設定するときにboost :: unique_lockを使用しました。これはreceivedInputを読み込むときに使用しました。私は例を使用しましたhere
¤安全かどうか疑問に思うなら、そうではありません。何かが技術的に安全であるかどうかに関係なく、状況を理解することができなければ短時間で始めても完璧であってもバグが発生します。コードは事実上安全ではありませんが、事実上安全です。たとえば、技術的には、「チェック」スレッドは「if」で中断され、「input」スレッドは7行で処理される可能性があります。実際には起こることはありませんが、Bad Things™*のようなコードで実現します。 :-)乾杯&乾杯。 –