【发布时间】:2018-10-17 16:16:52
【问题描述】:
考虑多个线程同时执行以下代码:
long gf = 0;// global variable or class member
//...
if (InterlockedCompareExchange(&gf, 1, 0)==0) // lock cmpxchg
{
// some exclusive code - must not execute in concurrent
gf = 0; // this is ok ? or need
//InterlockedExchange(&gf, 0); // [lock] xchg
}
将上面的代码视为类似 C 的伪代码,将或多或少地直接转换为汇编,而无需对编译器优化做出通常的让步,例如重新排序和存储消除。
所以在某个线程独占获得标志gf- 以退出临界区之后,是否足以写入零(如gf = 0)或者这是否需要联锁-InterlockedExchange(&gf, 0)?
如果两者都OK,从性能角度看哪个更好,假设多个内核同时调用InterlockedCompareExchange(&gf, 1, 0)的概率很高?
多个线程定期执行此代码(从多个位置,当某些事件触发时),重要的是下一个线程在释放后尽快再次进入临界区。
【问题讨论】:
-
我会使用更详细的标题并在此处添加几个标签,您将获得更多帮助。
-
@Ryanman - 这个问题(我如何看待)仅与 x86-x64 内存顺序有关。与编译器、语言、操作系统无关。所以不要在这里查看可以使用哪些更多标签或更多详细信息
-
正如彼得的回答所示,它肯定与 la 语言和编译器有关。作为没有 re-oredring 编译器的伪代码,它可以工作,作为具有特定内存模型的实际 C 或 C++,它不能工作。
标签: multithreading x86 locking x86-64 mutual-exclusion