std::mutex是否公平

Is std::mutex fair?

本文关键字:mutex std 是否      更新时间:2023-10-16

正如问题所述,std::mutex公平吗?也就是说,如果线程A锁定了互斥体,然后B和C按此顺序对其调用"lock()",他们会按相同顺序获得互斥体的锁吗?还是顺序未指定?

文档中根本没有提到这一点。

标准(§30.4)没有提到任何关于互斥体上竞争线程之间公平性的要求,所以它可能是公平的,也可能不是公平的。

在实践中,std::mutex实现可能会使用其平台提供的任何互斥实现,这是最不公平的,因为这通常更简单、更高效。在windows上,例如互斥锁通常是公平的,但并不总是如此。一些实现,例如线程构建块提供了公平的特殊互斥,但这些互斥不是基于操作系统的本机互斥,通常被实现为旋转锁(有自己的注意事项)。

如果文档没有解决这个问题,我们可以建议它是未指定的,如果没有指定,你可能会惊讶地发现他们以他们要求的相同顺序获得锁。。。

为了确保线程按照要求的顺序获得互斥,我建议您查看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();
    }
}

这个例子展示了如何在处理一些数据之前等待处理。