0
do { while (test_and_set(&lock))
; /* do nothing */
/* critical section */
lock = false;
/* remainder section */
} while (true);



boolean test_and_set (boolean *target)
{
boolean rv = *target;
*target = TRUE;
return rv:
}

我不明白它应该如何工作,因为无论 while (test_and_set(&lock) 返回什么,无论是真还是假, do{} 代码仍然会运行临界区。它什么都不做,然后立即运行关键部分,那么这如何帮助同步线程?

4

1 回答 1

2

它不是不管test_and_set返回什么。请注意,它test_and_set返回给定位置的先前值,因此while(test_and_set(&lock));(注意终止分号!)将在 CPU 上旋转,而另一个线程“拥有”锁。

但是请注意,您的实际实现test_and_set不是原子的,因此实际上不是线程安全的。

如果我重新格式化您的代码看起来像这样,也许会有所帮助?

do {
    while (test_and_set(&lock)) {
        /* do nothing */
    }
    /* critical section */
    lock = false;
    /* remainder section */
} while (true);
于 2013-09-27T20:58:14.833 回答