if
接続詞でアトミックを作成する方法はありますか? つまり、どうにかif(A && B)
して C でアトミックにテストできますか? 最初の接続で短絡した場合は問題ありませんが、そうでない場合は、チェックするB
までA
に変更されている可能性があります。何か案は?
EDIT : 粗いロックやセマフォを使用せずに。
if
接続詞でアトミックを作成する方法はありますか? つまり、どうにかif(A && B)
して C でアトミックにテストできますか? 最初の接続で短絡した場合は問題ありませんが、そうでない場合は、チェックするB
までA
に変更されている可能性があります。何か案は?
EDIT : 粗いロックやセマフォを使用せずに。
両方のオブジェクトへのアクセスを手動で同期する必要があります! 他にどのようになりたいですか?
これは並列プログラミングの基本的な考え方であり、別の方法で作成しない限り、一度に 2 つのことが発生する可能性があります。
擬似コードのサンプル:
//Comparison:
{
lock(Amutex);
lock(Bmutex);
bool result = A && B;
unlock(Amutex);
unlock(Bmutex);
if (result) // ...
}
//assignment:
{
lock(Amutex);
A = val;
unlock(Amutex);
}
B を確認するまで A を絶対に変更してはならない場合は、提案されているように、A でロック/ミューテックス (またはクリティカル セクションなどの他の同期プリミティブ) を使用できます。
A と B を 1 つのアラインされた 32 ビットまたは 64 ビットの整数に結合することもできます。これは、提案されているように、同期プリミティブまたは CAS または特別な CPU 命令を使用して、常にアトミックに全体として読み書きします。
システムがシングル プロセッサの場合、A と B の読み取りと書き込み中にすべての割り込みまたはスケジューリングを禁止して、同じ効果を達成することもできます。A または B が異なる CPU によって変更される可能性がある場合、これはマルチプロセッサ システムでは機能しません。
A の変更を許容でき、B を読み取る前と B を読み取った後に同じ A の値を確認することのみに関心がある場合は、A を 2 回読み取り、その間に B を読み取ることができます。読み取りの順序を確認するように注意する必要があります。揮発性および/またはメモリバリアは、順序を強制するのに役立ちます。
これらはすべて、ターゲット ハードウェア、OS、およびコンパイラに固有のものであり、これらの詳細を知らずに質問に詳細に回答することはできません。
amutex
または aを使用して、変更semaphore
から保護A
します。
または、これを試すこともできます。
bool A_initial;
if( (A_initial = A) && B && (A==A_initial) ) { /*A has not changed and
condition evaluated to true. */
}
else if (A ! = A_initial){ /* You have to redo the if() or
whatever if A is changed */
}