【问题标题】:How does this synchronization algorithm work?这种同步算法是如何工作的?
【发布时间】:2023-03-13 04:29:01
【问题描述】:
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{} 代码仍然会运行临界区。它什么都不做,并且然后立即运行临界区,那么这如何帮助同步线程呢?

【问题讨论】:

  • 这显然不是线程安全的。谁说的?
  • while( test_and_set( &lock ) ); 将循环直到它变为假,然后它将运行关键部分。虽然不太明白test_and_set 在做什么
  • 这是在您所针对的任何特定平台上吗?因为有些平台内在函数可能会为您正确做到这一点。坦率地说,要回答你关于它如何工作的问题,它没有(当然不可靠)。

标签: c multithreading synchronization


【解决方案1】:

这与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);

【讨论】:

  • 所以如果lock = true,它什么也不做,如果lock = false,它运行临界区,然后把锁设置为false,这样另一个线程可以运行它?你会如何让它成为原子的?
  • 您不能仅使用 C 代码使其原子化。您需要某种或某种其他形式的低级支持,例如总线锁定指令或(在单处理器机器上)中断禁用。这些东西通常由标准库提供,但它们是针对每个平台的,因此不了解平台就没有通用的答案。
猜你喜欢
  • 2023-04-01
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多