Silberschatz、Galvin、および Gagne による書籍「Operating System Principles」には、同期に関する章の TestAndSet() 命令に関する次の定義が含まれています。
boolean TestAndSet(boolean *target) {
boolean rv = *target;
*target = TRUE;
return rv;
}
上記の命令を使用した相互排除の実装も、次のように提供されます。
do {
while(TestAndSetLock(&lock))
; // do nothing
// critical section
lock = FALSE;
// remainder section
} while(TRUE);
では、 targetを TRUEに設定する条件がない場合、相互排除はどのように達成されるのでしょうか。
次の状況を考えてみましょう。プロセス P0 が共有変数ロックを TRUE に設定し、そのクリティカル セクションに入ります。別のプロセス P1 が上記の while ループで TestAndSet() を呼び出し、無条件にロックを FALSE に設定しながら TRUE を返します (P0 がロックを持っているため)。while ループで 2 回目に TestAndSet() が呼び出されると、FALSE が返され、P0 がクリティカル セクションにあるにもかかわらず、P1 がクリティカル セクションに入ります。次に、相互排除に違反します。
私はいくつかの検索を行い、TestAndSet() の次の代替定義を含む (ノースカロライナ州立大学 CS 部門の) Mithun Acharya と Robert Funderlic による論文に出くわしました。
boolean Test-and-Set(boolean target)
begin
if(target == false):
target = true;
return target;
end
これは私にとってより理にかなっています。比較のためにそれを含めました。また、この論文には参考文献の 1 つとして Silberschatz の本がリストされているためです。
教科書で見つけた定義 (最初に提供したもの) を使用して相互排除を達成する方法がわかりません。誰か助けてもらえますか?