【发布时间】:2019-04-06 12:46:49
【问题描述】:
(这里,临界区,我的意思是任何同步机制,防止并发访问某些资源。)
似乎网络上的共识是,您只需要在进入临界区时获取语义,并在离开时释放语义。但这不是打开了僵局的可能吗?
这里有一些伪代码来解释我的意思。这是原始代码:
Thread 1:
enter A // acquire semantics
// ... some work within A
leave A // release semantics
enter B // acquire semantics
// ... some work within B
leave B // release semantics
Thread 2:
enter B // acquire semantics
// ... some work within B
leave B // release semantics
enter A // acquire semantics
// ... some work within A
leave A // release semantics
当执行这段代码时,CPU 可以合法地将它转换成这个(acquis 之前没有任何移动,releases 之后没有任何移动):
Thread 1:
enter A // acquire semantics
enter B // acquire semantics
// ... some work within A
// ... some work within B
leave A // release semantics
leave B // release semantics
Thread 2:
enter B // acquire semantics
enter A // acquire semantics
// ... some work within B
// ... some work within A
leave B // release semantics
leave A // release semantics
但是现在,我们遇到了以前没有的死锁危险!两个线程进入多个临界区,但顺序不同。
那么关键部分是否也不需要防止存储/加载重新排序? IE。他们不需要顺序一致的语义而不仅仅是获取/释放吗?为什么不指定这个
【问题讨论】:
标签: multithreading locking mutex deadlock memory-barriers