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)返回什么,无论是true还是false,do {}代码仍会运行临界区。它会做没有,然后立即运行临界区,那么这有助于同步线程?
答案 0 :(得分: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);