为什么 std::mutex 需要很长且极不规则的时间来共享?

2023-12-11

此代码演示了互斥体在两个线程之间共享,但一个线程几乎始终拥有它。

#include <thread>
#include <mutex>
#include <iostream>

#include <unistd.h>

int main ()
{
    std::mutex m;

    std::thread t ([&] ()
    {
        while (true)
        {
            {
                std::lock_guard <std::mutex> thread_lock (m);

                sleep (1); // or whatever
            }
            std::cerr << "#";
            std::cerr.flush ();
        }
    });

    while (true)
    {
        std::lock_guard <std::mutex> main_lock (m);
        std::cerr << ".";
        std::cerr.flush ();
    }
}

在 Ubuntu 18.04 4.15.0-23-generic 上使用 g++ 7.3.0 编译。

输出是两者的混合# and .字符,表明互斥锁正在被共享,但模式令人惊讶。通常是这样的:

.......#####..........................##################......................##

thread_lock锁定互斥锁very很久。几秒甚至几十秒后,main_lock接收控制(短暂地)然后thread_lock把它拿回来并保存很长时间。呼唤std::this_thread::yield()并没有改变任何东西。

为什么两个互斥体获得锁的可能性不同,如何使互斥体以平衡的方式共享?


std::mutex并不是为了公平而设计的。它不保证锁定的顺序被保留,你要么幸运地获得锁,要么没有获得锁。

如果您想要更公平,请考虑使用std::condition_variable like so :

#include <thread>
#include <mutex>
#include <iostream>
#include <condition_variable>

#include <unistd.h>

int main ()
{
    std::mutex m;
    std::condition_variable cv;
    std::thread t ([&] ()
    {
        while (true)
        {
            std::unique_lock<std::mutex> lk(m);
            std::cerr << "#";
            std::cerr.flush ();
            cv.notify_one();
            cv.wait(lk);
        }
    });

    while (true)
    {
        std::unique_lock<std::mutex> lk(m);
        std::cerr << ".";
        std::cerr.flush ();
        cv.notify_one();
        cv.wait(lk);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 std::mutex 需要很长且极不规则的时间来共享? 的相关文章

  • Asp.net core默认路由

    简化版Startup code public void ConfigureServices IServiceCollection services services AddMvc public void Configure IApplica
  • 使用 Xamarin.Forms 和 Zxing 生成 QR 码

    我在网上看到了很多关于这个的内容 旧帖子 但似乎没有什么对我有用 我正在尝试从字符串中生成二维码并将其显示在应用程序中 这就是我一开始的情况 qrCode new ZXingBarcodeImageView BarcodeFormat Ba
  • 为什么在 C++ 中声明枚举时使用 typedef?

    我已经很多年没有写过任何 C 了 现在我正试图重新开始 然后我遇到了这个并考虑放弃 typedef enum TokenType blah1 0x00000000 blah2 0X01000000 blah3 0X02000000 Toke
  • C++中的类要具备什么条件才能成为容器?

    我是 C 编程新手 偶然发现了这个术语containers举例如下vector deque map etc 一个企业的最低要求应该是什么class应该满足被称为container in C 我将从 范围 这个概念开始 Range 只有两个方
  • 具有多个谓词的 C++11 算法

    功能如std find if来自algorithmheader 确实很有用 但对我来说 一个严重的限制是我只能为每次调用使用 1 个谓词count if 例如给定一个像这样的容器std vector我想同时应用相同的迭代find if 多个
  • 为什么 C# 中同一类型的隐式和显式运算符不能共存? [复制]

    这个问题在这里已经有答案了 为什么同一类中两个相同类型的运算符 显式和隐式 不能共存 假设我有以下内容 public class Fahrenheit public float Degrees get set public Fahrenhe
  • 类中是否可以有虚拟类声明?

    我正在为个人项目中框架的各个组件设置一个接口 我突然想到了一些我认为可能对接口有用的东西 我的问题是这是否可能 class a public virtual class test 0 class b public a public clas
  • “没有合适的默认构造函数可用”——为什么会调用默认构造函数?

    我已经查看了与此相关的其他一些问题 但我不明白为什么在我的情况下甚至应该调用默认构造函数 我可以只提供一个默认构造函数 但我想了解它为什么这样做以及它会产生什么影响 error C2512 CubeGeometry no appropria
  • 如何设置消息队列的所有者?

    System Messaging MessageQueue 类不提供设置队列所有权的方法 如何以编程方式设置 MSMQ 消息队列的所有者 简短的答案是 p invoke 对 windows api 函数的调用MQSetQueueSecuri
  • 编写具有多种类型的泛型扩展方法时的类型推断问题

    我正在为 IEnumerable 编写一个通用扩展方法 用于将对象列表映射到另一个映射对象列表 这就是我希望该方法的工作方式 IList
  • 将 2 个字节转换为整数

    我收到一个 2 个字节的端口号 最低有效字节在前 我想将其转换为整数 以便我可以使用它 我做了这个 char buf 2 Where the received bytes are char port 2 port 0 buf 1 port
  • 如何在 EF Core 2.1 中定义外键关系

    我的 DAL 使用 EF Core 2 1 这就是我的模型的样子 一名用户只能拥有一种角色 Role entity kind of master public class Role public int RoleId get set pub
  • C++ 模板可以提供 N 个给定类的公共父类吗?

    我正在寻找一个 C 模板 它可以找到一组给定类的共同父级 例如 class Animal class Mammal public Animal class Fish public Animal class Cat public Mammal
  • 使用 Unity 在 C# 中发送 http 请求

    如何使用 Unity 在 C 中发送 HTTP GET 和 POST 请求 我想要的是 在post请求中发送json数据 我使用Unity序列化器 所以不需要 新的 我只想在发布数据中传递一个字符串并且能够 将 ContentType 设置
  • 用数组或向量实现多维数组

    我想使用单个数组或向量实现多维数组 可以像通常的多维数组一样访问它 例如 a 1 2 3 我陷入困境的是如何实施 操作员 如果数组的维数为 1 则 a 1 应该返回位于索引 1 处的元素 但是如果维数大于一怎么办 对于嵌套向量 例如 3 维
  • 将日期时间显示为 MM/dd/yyyy HH:mm 格式 C#

    在数据库中 日期时间以 MM dd yyyy HH mm ss 格式存储 但是 我想以 MM dd yyyy HH mm 格式显示日期时间 我通过使用 String Format 进行了尝试 txtCampaignStartDate Tex
  • 与 Entity Framework Core 2.0 的一对零关系

    我正在使用 C 和 NET Framework 4 7 将 Entity Framework 6 1 3 Code First 库迁移到 Entity Framework Core 我一直在用 Google 搜索 Entity Framew
  • 使用 boost 异步发送和接收自定义数据包?

    我正在尝试使用 boost 异步发送和接收自定义数据包 根据我当前的实现 我有一些问题 tcpclient cpp include tcpclient h include
  • 在 C 中使用 #define 没有任何价值

    If a define没有任何价值地使用 例如 define COMMAND SPI 默认值是0吗 不 它的评估结果为零 从字面上看 该符号被替换为空 然而 一旦你有了 define FOO 预处理器条件 ifdef FOO现在将是真的 另
  • 如何在c中断言两个类型相等?

    在 C 中如何断言两种类型相等 在 C 中 我会使用 std is same 但搜索 StackOverflow 和其他地方似乎只能给出 C 和 C 的结果 在C中没有办法做到这一点吗 请注意 这不是询问变量是否具有某种类型 而是询问两个类

随机推荐

  • EF 建立自我关系

    这次我有一个简单的问题 我有一张表 与他自己相关 Id IdParent NodeName Where IdParent可以有 0 个或多个Id 问题是 我如何使用 Fluent Api 或数据注释来配置这种关系 这种关系的结果是一棵树 有
  • IIS7 无法通过进程启动启动我的 Exe 文件

    我读过很多文章 但据我所知 我已经完成了所有工作 在本地计算机 VS2010 上一切正常 仅当在 IIS7 服务器上工作时才会出现该问题 我想启动一个 exe 文件 如果我从 Windows 资源管理器手动启动它 它在服务器上运行得很好 D
  • 有没有办法测试Excel中的图表是否有其系列堆叠

    据我了解 Chars 有ChartType as XlChartType属性 但那是一长串枚举值 有没有办法测试图表是否使用堆叠系列而不列出全部 我试图避免以下情况 Select ActiveChart ChartType Case xlA
  • POST 抛出 HttpRequestMessage 不包含 Form 的定义

    我正在尝试在 C 中获取 POST 数据 我读过的所有内容都说要使用 Request Form parameterNameHere 我正在尝试这样做 但我收到一条错误消息 System Net Http HttpRequestMessage
  • Flowtype - 制作密封的空物体

    Flow 的文档说 When you create an object without any properties you create an unsealed object type in Flow 是否可以创建一个没有属性的密封对象
  • PDO 和 php - 调用非对象上的成员函数prepare()

    我开始学习 PDO 但我仍然是一个 PHP 新手 我正在做一个项目来增加我的知识 但我陷入了第一个障碍 我收到此错误 在该代码的第 37 行调用非对象上的成员函数prepare 这是来自database class php
  • C 结构体不定义类型?

    我刚刚开始学习 C 具有专业的 Java 背景和一些 如果没有太多的话 C 知识 我很惊讶这在 C 中不起作用 struct Point int x int y Point p p x 0 p y 0 看来我必须声明一下p using st
  • 位置管理器 didUpdateLocations 未被调用

    因为某些原因didUpdateLocations即使我将委托设置为视图控制器 也不会被调用 在info plist我设置了钥匙Privacy Location When In Use Usage Description到描述 所以我不确定我
  • rake sunspot:重建索引 rake 中止! RSolr::Error::Http - 404 未找到

    我无法再重新索引 也无法解决此问题 花几个小时在网上挖掘这个问题 关于生产环境 发展一切顺利 如何解决这个问题 rake sunspot reindex rake aborted RSolr Error Http 404 Not Found
  • CSS 仅显示隐藏

    我网站的设计与他们公司融为一体 基本上他们正在用我的信息和徽标重新命名他们的网站 他们想要额外的钱来更改任何 HTML 文件 我只能访问样式表 css 文件和图像 我可以用 css 显示 隐藏吗h3下面的示例中列出 我想隐藏每个下面的内容h
  • 为什么我们需要在 case 语句之后break?

    为什么编译器不自动在 switch 中的每个代码块后面放置break语句 是因为历史原因吗 你什么时候想要执行多个代码块 有时 将多个案例与同一代码块相关联会很有帮助 例如 case A case B case C doSomething
  • 实体框架正在急切加载单个实体

    我的 WebApi 控制器的精简版本如下 HttpGet Route public async Task
  • 允许在 HTML5 Phonegapped Android 应用程序中打开本地文件

    我有一个 HTML5 应用程序 在浏览器中运行良好 当打包成 iOS 应用程序时就很好了 但是 当我为 Android 构建时 通过 adb 调试时收到以下消息 XMLHttpRequest cannot load file android
  • 将动态数字格式插入内插字符串中

    C 6 0 带来了这个漂亮的新格式化操作 由 而不是这样做 String lastName Doena String firstName DJ Console WriteLine String Format 1 0 lastName fir
  • 如何调用iCarte SDK方法扫描RFID

    我有 iCarte Sdk 用于读取 RFID 标签值 但我不知道如何开始使用该 sdk 我已经根据 iCarte Sdk 的要求设置了我的项目 并且我能够使用 iCarte Sdk 中提供的一些方法获取硬件详细信息 但我不知道如何启动扫描
  • 日期格式不起作用?

    String selectedDate 2012 createdMonth createdDay SimpleDateFormat dateFormat new SimpleDateFormat yyyy MM dd try created
  • 在适用于 tvOS 12 的 TVUIKit 中使用 TVPosterImage

    tvOS 12 有一个新框架TVUIKit 它引入了锁定视图 我感兴趣的课程是电视海报视图 基本上是这样设计的 斯威夫特 4 2 open class TVPosterView TVLockupView One may use UICont
  • 在 x86-64 AT&T 汇编中,地址前面的星号 * 意味着什么?

    下面这行是什么意思 401147 ff 24 c5 80 26 40 00 jmpq 0x402680 rax 8 内存地址前面的星号是什么意思 另外 当内存访问方法缺少第一个寄存器值时 这意味着什么 通常它类似于 register rax
  • 更好地理解序言

    我试图理解 Prolog 以及它如何使用解析算法 我发现了这个例子 hates 1 2 hates 2 3 hates 3 4 jealous A B jealous A C jealous C B jealous A B hates A
  • 为什么 std::mutex 需要很长且极不规则的时间来共享?

    此代码演示了互斥体在两个线程之间共享 但一个线程几乎始终拥有它 include