Linux 上的 pthread 条件变量,奇怪的行为

2023-12-09

我正在 Linux 上同步读取器和写入器进程。

我有 0 个或多个进程(读者)需要休眠,直到它们被唤醒、读取资源、返回休眠状态等等。请注意,我不知道随时有多少个读者进程启动。 我有一个进程(编写器),它在资源上写入,唤醒读者并执行其业务,直到另一个资源准备好为止(详细来说,我开发了一个不饥饿的读者-编写器解决方案,但这并不重要)。

为了实现睡眠/唤醒机制,我使用 Posix 条件值 pthread_cond_t。客户端对变量调用 pthread_cond_wait() 来休眠,而服务器则执行 pthread_cond_broadcast() 来唤醒它们。正如手册所述,我用关联的 pthread 互斥锁的锁定/解锁来包围这两个调用。

条件变量和互斥体在服务器中初始化,并通过共享内存区域在进程之间共享(因为我不使用线程,而是使用单独的进程),我确信我的内核/系统调用支持它(因为我检查过_POSIX_THREAD_PROCESS_SHARED)。

发生的情况是第一个客户端进程完美地睡眠和唤醒。当我启动第二个进程时,它会阻塞其 pthread_cond_wait() 并且never醒来,即使我确定(通过日志)调用了 pthread_cond_broadcast() 。

如果我终止第一个进程并启动另一个进程,它就会完美运行。换句话说,条件变量 pthread_cond_broadcast() 似乎一次只唤醒一个进程。如果多个进程等待同一个共享条件变量,则只有第一个进程能够正确唤醒,而其他进程似乎只是忽略广播。

为什么会有这种行为?如果我发送 pthread_cond_broadcast(),every等待进程应该被唤醒,而不仅仅是一个(但是,并不总是同一个)。


set the PTHREAD_PROCESS_SHARED属性在你的 condvar 和 mutex 上?

对于Linux请参阅以下内容man pages:

  • pthread_mutexattr_init(有样品)
  • pthread_mutexattr_setpshared
  • pthread_condattr_init
  • pthread_condattr_setpshared

方法、类型、常量等通常定义在/usr/include/pthread.h, /usr/include/nptl/pthread.h.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux 上的 pthread 条件变量,奇怪的行为 的相关文章

随机推荐

  • Java:在 Ubuntu 上请求 root 权限

    如何调用身份验证窗口 从类中为当前应用程序授予 root 一段时间的访问权限 例如 我正在编写一些应用程序来处理分区 因此它需要 root 权限才能执行某些操作 也许你无法用 Java 做到这一点 最好的方法是 也许你可以检测到该程序没有运
  • 每天在特定时间运行 DAG

    我读过多个例子schedule interval start dateAirflow 文档也多次出现 但我仍然无法理解 我如何在每天的特定时间执行我的 DAG 例如 现在是 9 30 上午 我部署 DAG 并且希望它在 10 30 执行 我
  • 在使用 std::array 的类的构造函数中初始化 std::array 的大小

    是否可以使用std array
  • 致命错误:调用未定义的函数 ftp_ssl_connect()

    我正在尝试在 PHP 中设置 FTP SSL 连接 我用过ftp connect 很好 效果很好 一旦我尝试使用ftp ssl connect 我收到此错误 致命错误 调用未定义的函数 ftp ssl connect 我确实在 PHP 扩展
  • 具有动态列的 LINQ Pivot

    我正在尝试使用带有动态列的 LINQ 创建数据透视表 我在 SQL Server 中创建了一个数据透视表 您不知道将使用哪些列 但不知道如何将其转移到 LINQ 中 有人有链接供我开始使用吗 Cheers List
  • 使用 python 提取 pdf 表格中包含的文本的最佳方法是什么?

    我正在构建一个程序 从 pdf 中提取文本 将其放入结构化格式 然后将其发送到数据库 我有大约 1 400 个单独的 pdf 文件 它们都遵循类似的格式 但文档总结的措辞和计划设计中的细微差别使其变得棘手 我在 python 中尝试过几个不
  • 我什么时候应该关闭DatabaseHelper?

    参考this链接 如果只有一个连接 什么时候是关闭连接的好时机 我有一项服务始终在后台运行 什么时候是打电话的好时机close 功能 有什么建议么 你实际上不必打电话close 例如 如果您实现内容提供商 则没有机会调用close 我们被告
  • 禁用表单提交,直到选中(两个)复选框

    我们有一个表单 在提交表单之前 我们有两个复选框 privacy 条款和条件 我想做的是 在验证复选框时遇到问题 禁用提交按钮 直到选中两个复选框为止 这些的 html 是
  • NumPy for windows python 2.7 [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我找不到适用于 windows python 2 7 的 NumPy 尽管我找到了它的
  • 将区域设置设置为系统默认 UTF-8

    当在 rApache 中运行 R 时 语言环境是从 Apache Web 服务器继承的 因此Sys getlocale 总是等于 C 我希望使用我的网络应用程序UTF8 所以我使用 Sys setlocale LC ALL en US UT
  • do 块中的返回类型

    我试图理解 Haskell 中的 Monad 在我无数次的代码实验中我遇到了这个事情 f2 do return da 事实上 它不想在编译时出现关于类型的巨大错误 我认为唯一重要的部分是 No instance for Monad m0 a
  • 如何通过将列的类别分成集合来过滤数据框?

    我有一个数据框 Prop ID Unit ID Prop Usage Unit Usage 1 1 RESIDENTIAL RESIDENTIAL 1 2 RESIDENTIAL COMMERCIAL 1 3 RESIDENTIAL IND
  • 我可以在对象原型(方法)中定义属性吗?

    问题第 1 部分 我创建了一个包含属性的对象构造函数 但我想知道是否可以在其中一个方法中定义该对象的另一个属性 例如 var Player function p1 this property1 p1 this property2 0 那么
  • 是否可以在不同列的 CSS 网格的内部间隙中绘制垂直分隔符?

    我想要一个由可变长度元素组成的响应式网格 网格应填充包含元素的可用宽度 列数根据容器的宽度而变化 使用 CSS 网格可以直接实现这一点 但是 我不知道如何在列之间添加垂直边框 即仅在内部列间隙中 下面的简单演示成功地在三列的情况下实现了垂直
  • 四舍五入最接近的 0.5

    我想以这种方式四舍五入 13 1 round to 13 5 13 2 round to 13 5 13 3 round to 13 5 13 4 round to 13 5 13 5 13 5 13 6 round to 14 0 13
  • 使用 JavaScript 验证特殊字符

    特殊字符 lt gt and 不允许出现在文本框中 我需要进行验证检查以限制提交时的这些字符以及空检查 我在函数中编写了整个验证代码 并在单击提交按钮时调用它 但单击时无法识别该函数 请帮我写一些JavaScript代码来实现这个功能 一个
  • Vue Router、GitHub Pages 和自定义域无法使用路由链接

    我的域名 myname com 我的 GitHub 存储库 myname 我的 GitHub 名称 myname 底层 GH 页面 URL myname github io myname 我的问题 我使用 History Vue Route
  • Android ListView 编程选择/突出显示

    我有一个简单的列表视图和列表适配器设置 如下所示 listAdapter new ArrayAdapter
  • 为什么这个任务挂起?

    TestMethod public void Y int i 0 new Task gt i Wait Assert AreEqual 1 i 上例中的任务为何永远等待 我该怎么办Wait 对于任务 所以它不会挂起 你没有start the
  • Linux 上的 pthread 条件变量,奇怪的行为

    我正在 Linux 上同步读取器和写入器进程 我有 0 个或多个进程 读者 需要休眠 直到它们被唤醒 读取资源 返回休眠状态等等 请注意 我不知道随时有多少个读者进程启动 我有一个进程 编写器 它在资源上写入 唤醒读者并执行其业务 直到另一