过去两周左右我一直在处理线程,我想问一下有关线程的问题。
我从来没有处理过一个我知道的互斥量。为什么?因为我使用这里非常简单的布尔开关(C ++,示例线程):
bool fakeMutex = false;
...
while (fakeMutex);
fakeMutex = true;
// do smth
fakeMutex = false;
我一直在考虑这个问题而且我开始相信它有一个非常小的(但我认为可能的机会)它会失败。
鉴于在集合中这些理论应该看起来像这样:
Compare:
CMP 0,[offset fakeMutex]
JG Compare
MOV [offset fakeMutex],1
; do smth
MOV [offset fakeMutex],0
这个互斥锁失败的唯一方法是,如果CMP 0,[offset fakeMutex]执行而fakeMutex为false,然后在另一个线程接管之后,继续MOV [offset fakeMutex],1然后OLD线程返回到工作执行装配不应该。
这很有可能吗?
boost :: thread中定义的普通互斥锁的优点是什么?它如何确保组装不能拆分?它是否像上面的例子中那样像布尔“互斥”那样快速工作?
答案 0 :(得分:1)
这很有可能吗?
是。我有点滑稽,因为可能性取决于你的程序,它运行的环境等等。但如果你想要你的代码是正确的,你应该使用互斥锁。
boost :: thread中定义的普通互斥锁的优点是什么?
您已经确定了原则优势:它是原子和线程安全的。从而使您的代码正确。如果您希望程序确定性地输出结果(IE可靠),您必须使用某种类型的线程安全习惯用法。
如何确保组装能够拆分?
实施通常是平台和硬件特定的。实现互斥锁的一种方法是使用特殊的汇编指令"Compare And Swap"
它是否像boolean" mutex"一样快。比如上面的例子?
同步很可能会有成本。为了从多线程程序中获得出色的性能,只有在必要时才会同步状态,作为最后的手段来锁定自由数据结构。 Here是一本很有用的指南。
答案 1 :(得分:0)
不要那样做。在检查变量然后发生上下文切换时,很可能会遇到这种情况。始终使用原子操作。它可以通过不同的方式完成,这一切都取决于平台和操作系统。当操作系统禁用中断或使用某些原子操作时(如果是英特尔,如前所述,CMPXCHG或使用LOCK前缀),可以执行此操作。