Test and test-and-set とは

コンピュータサイエンスでは、マルチプロセッサ環境での相互排除を実装するために、テストおよび設定されたCPU命令が使用されます。正しいロックはテストセットで実装できますが、ビジーロックでリソースの競合が発生する可能性があります(バスをロックし、テストおよび設定操作でメモリにアトミックにアクセスする必要がある場合)。
オーバーヘッドを下げるために、より精巧なロックプロトコルテストとテストセットが使用されています。主なアイデアは、テストセットでスピンするのではなく、ロックに対する以下のエントリプロトコルを使用して、テストとセットの成功の可能性を高めます。
 boolean locked:= false //共有ロック変数手続きEnterCritical(){do {while(locked == true)//ロックがフリーになるまでスピンをスキップする} TestAndSet(locked)//実際の原子ロック}
終了プロトコルは次のとおりです。
 プロシージャExitCritical(){locked:= false}
エントリプロトコルは、通常のメモリ読み出しを使用してスピンを行い、ロックが解放されるのを待ちます。テストとセットは、通常のメモリ読み取りではフリーであると判断されたときにロックを取得するためにのみ使用されます。したがって、高価な原子メモリ演算は、単純なスピン・アラウンド・テスト・セットよりも頻繁に起こる。
使用されるプログラミング言語が短絡評価をサポートする場合、入力プロトコルは次のように実装できます。
 プロシージャEnterCritical(){while(locked == trueまたはTestAndSet(locked)== true)skip //ロックされるまでスピンします}