正如问题所述,std::mutex
是否公平?即,如果线程A锁定了互斥锁,然后B和C按此顺序调用'lock()',它们会以相同的顺序获得互斥锁,还是顺序不确定?
文档根本没有涉及这个问题。
正如问题所述,std::mutex
是否公平?即,如果线程A锁定了互斥锁,然后B和C按此顺序调用'lock()',它们会以相同的顺序获得互斥锁,还是顺序不确定?
文档根本没有涉及这个问题。
标准(§30.4)未涉及互斥锁中竞争线程之间公平性的要求,因此可能是公平的也可能是不公平的。
实际上,std::mutex
的实现通常会使用其所在平台提供的互斥锁实现,这些实现大多数都是不公平的,因为这样通常更加简单高效。例如,在 Windows 上,互斥锁通常是公平的,但并非总是如此。某些实现(e.g. Thread Building Block)提供了特殊的公平互斥锁,但这些互斥锁不是基于操作系统本地的互斥锁实现的,通常是作为自旋锁的方式实现的(其中有自己的注意事项)。
std::condition_variable
或 std::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();
}
}
condition_variable
如何确保公平性? - ronagwait
方法会解锁互斥锁并将线程放入等待条件的线程列表中,因此你可以创建一个公平锁。这里有一个链接,其中包含两个示例:https://dev59.com/AmUq5IYBdhLWcg3wF8rw - Pierre Fourgeaud