【问题标题】:if (lock) wait else lock=1 CS lock=0if (lock) wait else lock=1 CS lock=0
【发布时间】:2013-09-21 10:20:09
【问题描述】:

考虑这种同步机制的可能实现,目标是一次只有一个线程处于临界区 (CS):

if (lock)
      wait
else
     lock=1
      CS
     lock=0

这适用于多处理器系统吗?

【问题讨论】:

  • @H2CO3 如果您知道主题,则很容易推断上下文。我已经编辑过了。

标签: concurrency synchronization locking


【解决方案1】:

没有。这甚至不适用于单处理器系统。假设您有两个线程在执行此操作。他们可以这样安排:

thread1                     thread2
if (lock) /*false*/
                            if (lock) /*false*/
                            lock=1
lock=1
/*CS*/
                            /*CS*/
/*CS continues*/
                            /*CS continues*/
                            lock=0
lock=0

您不能以这种方式实现锁定。实现锁的方法之一是使用处理器指令原子地检查变量的当前值分配给它,例如test-and-set。 (还有很多其他可能的方法,不同的CPU提供不同的方法,有时不止一种。)

【讨论】:

  • 您能告诉我们如何为单处理器系统纠正此代码吗? test-and-set 只会让它适用于多处理器系统,对吧?
  • @Gaurav Test-and-set 是spinlock 的构建块,这是一种适用于很短时间的锁的锁实现。您需要确保其他线程可以在一个线程正在执行wait 时运行。自旋锁在单处理器系统上几乎没有什么用处,除了作为具有等待队列的互斥锁的构建块外,它的工作原理与处理器的数量无关。
猜你喜欢
  • 2016-09-13
  • 1970-01-01
  • 2015-10-29
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
  • 2016-12-26
相关资源
最近更新 更多