这种同步算法如何工作?

时间:2013-09-27 20:52:08

标签: c multithreading synchronization

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 {}代码仍会运行临界区。它会做没有,然后立即运行临界区,那么这有助于同步线程?

1 个答案:

答案 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);