将变量写入与后续读取同步

时间:2019-05-20 22:13:31

标签: multithreading synchronization cpu-architecture low-level

在不同的CPU内核上执行两个线程:

t1: x = true
t2: print(x)

x最初为假。

如果第一次执行t1,则可能发生x仍在CPU写缓冲区中并且t2打印为假的情况。

要同步这些线程,我可以使用互斥锁:

t1:
   lock(mutex) 
   x = true
   unlock(mutex) 

t2: 
   lock(mutex) 
   print(x)
   unlock(mutex)

然后,如果首先执行t1,则t2将始终显示true。此解决方案有效,但有两个缺点:

  1. 很慢
  2. 它不能很好地传达我的意图。看起来我想实现互斥,但实际上我想立即传播更改。

我在这里的意图是,如果t1被t2抢占,则t2知道t1已经开始通过x = true信号通知它开始做某事,所以现在t2知道采取不同的代码分支,因为t1取决于某件事。如果在t1将x设置为true时,如果t2执行分支(如果x == false),则将失败。

那么,有没有更好或更有效的方法来实现我想要的?我对C ++代码以及底层CPU(可能是x86)如何执行该代码(例如内存屏障等)感兴趣。

1 个答案:

答案 0 :(得分:0)

如果我没看错的话,t1将承担一些看得见且复杂的工作量,并且您希望建议潜伏者(t2..n)不要打扰,因为设置了一些标志。您可以完全做到这一点,如果您的操作系统实施得很差,可以记录无争议的互斥开销,那么请切换操作系统。

但是,如果对显示的两个线程进行基准测试,则将测量什么是极不可能的操作模式。至少,除非系统处于空闲状态,否则您不会期望这种模式,因此,这都不重要。

我倾向于基于信号的设计,在该设计中,一些重要变量的(计算出的)状态发生了有意义的变化,从而使那些对此变量表示出兴趣的人发出警报。