0

过去两周左右我一直在处理线程,我想问有关线程的问题。

尽管我知道它们,但我从未处理过单个互斥体。为什么?因为我在这里使用非常简单的布尔开关(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 为假时执行,然后在另一个线程接管之后立即执行 MOV [offset fakeMutex],1 然后 OLD 线程返回作业执行程序集它不应该。

很有可能吗?

boost::thread 中定义的普通互斥锁有什么优点?它如何确保组件不能被拆分?它是否像上面示例中的布尔“互斥锁”一样快?

4

2 回答 2

1

很有可能吗?

是的。我有点油嘴滑舌,因为可能性取决于您的程序、它运行的环境等。但是如果您希望您的代码正确,您应该使用互斥锁。

boost::thread 中定义的普通互斥锁有什么优点?

您已经确定了主要优势:它是原子的和线程安全的。从而使您的代码正确。如果您希望您的程序确定性地输出结果(IE 是可靠的),您必须使用某种类型的线程安全习语。

它如何确保组件不能被拆分?

实现通常是特定于平台和硬件的。实现互斥锁的一种方法是使用特殊的汇编指令“比较和交换”

它是否像上面示例中的布尔“互斥锁”一样快?

同步很可能会产生成本。为了从多线程程序中获得出色的性能,仅在严格必要时才同步状态,作为最后的手段,查看无锁数据结构。是一个有用的指南。

于 2012-12-10T18:47:16.117 回答
0

不要那样做。当检查变量然后发生上下文切换时,您很可能会遇到这种情况。始终使用原子操作。它可以以不同的方式完成,这完全取决于平台和操作系统。它可以在操作系统禁用中断或使用某些原子操作时完成(在 Intel 的情况下,如前所述,CMPXCHG 或使用 LOCK 前缀)。

于 2012-12-10T23:06:25.413 回答