Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::mutex公平吗?_C++_C++11_Mutex - Fatal编程技术网

C++ std::mutex公平吗?

C++ std::mutex公平吗?,c++,c++11,mutex,C++,C++11,Mutex,正如问题所述,std::mutex公平吗?i、 例如,如果线程A锁定了互斥锁,然后B和C按此顺序调用互斥锁上的“lock()”,它们是按相同的顺序获得互斥锁,还是未指定顺序 这个问题根本没有解决 如果文档没有说明,我们可以建议未指定,如果未指定,您可能会惊讶地发现他们按照要求的顺序获得锁 为了确保线程按照要求的顺序获取互斥,我建议您查看std::condition\u variable或std::condition\u variable\u any 它们都在库标题中声明。在这两种情况下,它们都需

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


这个问题根本没有解决

如果文档没有说明,我们可以建议未指定,如果未指定,您可能会惊讶地发现他们按照要求的顺序获得锁

为了确保线程按照要求的顺序获取互斥,我建议您查看
std::condition\u variable
std::condition\u variable\u any

它们都在
库标题中声明。在这两种情况下,它们都需要使用互斥来提供适当的同步

下面是一个如何使用它的小示例:

#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();
    }
}
#包括
#包括
std::互斥mut;
std::队列数据;
std::条件变量cond;
void dummyDataPrepare()
{
while(准备()中的更多数据)
{
std::锁紧保护lo(mut);
//在数据上做很多事情
第二,通知某人;
}
}
void dummyDataProcessingThread()
{
while(true)
{
std::唯一锁定lo(mut);
等一下,
[]{return!data.empty();});
//你想做什么就做什么。。。
lo.unlock();
}
}
本例显示了如何等待某些数据处理后再对其执行操作。

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


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

如果文档没有说明,我猜这意味着它是未指定的。为了使它们保持有序:这可能是一个更好的“文档”来源,谢谢你的提示,但这是一个工作草案。你必须为发布的版本支付一大笔钱。公平性是一个实现细节。您唯一可以信赖的是,不提供任何公平性的实现不可能长期存在。或者换一种说法,当你使用别人的代码时,你应该对他们的正确性有信心。如果你不说出实现的名称,我们无法帮助你对此感觉更好。我需要知道std::mutex是否公平,而不是如何制作公平锁。#回复在我文章的顶部。我认为这不公平,因为它没有具体说明。这就是为什么我想给你一个使锁公平的方法…以及使用
条件变量
如何使事情公平?至少,通过一些代码,你可以使它公平。
wait
方法解锁互斥锁并将线程放入等待条件的线程列表中,这一事实可以创建一个公平锁。这里有两个这样做的例子:我不认为CV使它成为一个公平的互斥体。CV.notify_one()可以唤醒任何线程。可能您可以使用FIFO(队列)数据结构实现您的CV版本。