std :: mutex是否公平?

时间:2013-07-08 13:14:50

标签: c++ c++11 mutex

正如问题所述,std::mutex公平吗?即,如果线程A锁定了互斥锁,然后B和C按此顺序调用'lock()',它们是否会以相同的顺序获取互斥锁上的锁定,还是未指定顺序?

documentation根本没有解决这个问题。

2 个答案:

答案 0 :(得分:5)

标准(第30.4节)没有提及有关互斥体上竞争线程之间公平性的要求,因此它可能是公平的,也可能不公平。

在实践中std::mutex实现可能会使用他们的平台提供的任何互斥实现,这些都是不公平的,因为这通常更简单,更有效。在Windows上,例如互斥体大多是公平的,但并非总是如此。一些实施例线程构建块提供了公平的特殊互斥体,但这些互斥体并非基于OS本机互斥体,并且通常实现为自旋锁(它们有自己的警告)。

答案 1 :(得分:1)

如果文档没有解决,我们可以建议未指定,如果没有指定,你可能会有一些惊喜,他们按照他们要求的相同顺序获得锁定...

为了确保线程按照他们要求的顺序获取互斥锁,我建议您查看std::condition_variablestd::condition_variable_any

它们都在<condition_variable>库头中声明。在这两种情况下,他们都需要使用互斥锁来提供适当的同步。

以下是如何使用它的一个小例子:

#include <mutex>
#include <condition_variable>

std::mutex mut;
std::queue<dummyData> data;
std::condition_variable cond;

void dummyDataPrepare()
{
    while( more_data_in_preparation() )
    {
        std::lock_guard<std::mutex> lo( mut );
        // doing many things on data
        cond.notify_one();
    }
}

void dummyDataProcessingThread()
{
    while( true )
    {
        std::unique_lock<std::mutex> lo( mut );
        cond.wait( lo,
            []{ return !data.empty(); });
        // Do whatever you want ...
        lo.unlock();
    }
}

此示例显示了在对其执行操作之前,您可以等待某些数据进行处理。