在不同的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。此解决方案有效,但有两个缺点:
我在这里的意图是,如果t1被t2抢占,则t2知道t1已经开始通过x = true信号通知它开始做某事,所以现在t2知道采取不同的代码分支,因为t1取决于某件事。如果在t1将x设置为true时,如果t2执行分支(如果x == false),则将失败。
那么,有没有更好或更有效的方法来实现我想要的?我对C ++代码以及底层CPU(可能是x86)如何执行该代码(例如内存屏障等)感兴趣。
答案 0 :(得分:0)
如果我没看错的话,t1将承担一些看得见且复杂的工作量,并且您希望建议潜伏者(t2..n)不要打扰,因为设置了一些标志。您可以完全做到这一点,如果您的操作系统实施得很差,可以记录无争议的互斥开销,那么请切换操作系统。
但是,如果对显示的两个线程进行基准测试,则将测量什么是极不可能的操作模式。至少,除非系统处于空闲状态,否则您不会期望这种模式,因此,这都不重要。
我倾向于基于信号的设计,在该设计中,一些重要变量的(计算出的)状态发生了有意义的变化,从而使那些对此变量表示出兴趣的人发出警报。