多线程安全消息队列

2024-04-08

这是我基本上拥有的:

我有线程 A 定期检查消息并处理它们。

线程B和C需要向A发送消息。

当 B 和 C 或 B 或 C 尝试向 A 发送消息,而 A 正在处理消息并访问队列时,就会出现问题。

这个问题通常是如何解决的?

Thanks


这通常可以使用以下方法解决mutexes http://en.wikipedia.org/wiki/Mutex,或者其他多线程保护机制。

如果您在 Windows 上工作,MFC 提供了CMutex 类 http://msdn.microsoft.com/en-us/library/tt45160e%28v=vs.80%29.aspx对于这个问题。

如果您正在使用 posix 系统,则 posix api 提供pthread_mutex_lock, pthread_mutex_unlock, and pthread_mutex_trylock功能 https://computing.llnl.gov/tutorials/pthreads/#MutexLocking.

一些基本的伪代码可以很方便地演示它们在您的案例中的用途:

pthread_mutex_t mutex; *or* CMutex mutex;
Q queue;  // <-- both mutex and queue are global state, whether they are
          //     global variables, or passed in as parameters, they must
          //     be the shared by all threads.

int threadA(/* params */){
    while( threadAStillRunning ){
        // perform some non-critical actions ...
        pthread_mutex_lock(mutex) *or* mutex.Lock()
        // perform critical actions ...
        msg = queue.receiveMessage()
        pthread_mutex_unlock(mutex) *or* mutex.Unlock()
        // perform more non-critical actions
    }
}

int threadBorC(/* params */){
    while( theadBorCStillRunning ){
        // perform some non-critical actions ...
        pthread_mutex_lock(mutex) *or* mutex.Lock()
        // perform critical actions ...
        queue.sendMessage(a_msg)
        pthread_mutex_unlock(mutex) *or* mutex.Unlock()
    }
}

对于所有三个线程,它们对队列进行操作的能力取决于它们获取互斥体的能力 - 它们将简单地阻塞并等待,直到获取互斥体。这可以防止因使用该资源而引起的冲突。

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

多线程安全消息队列 的相关文章

  • Nullable 是不可能的,为什么不呢? [复制]

    这个问题在这里已经有答案了 如果这是一个愚蠢的问题 请原谅 我正在尝试更好地理解 Net 中的 Nullable 类型 从我从 Microsoft 源代码 使用 ReSharper 中注意到的内容 我了解到 Nullable 是一个结构 而
  • 通过另一个列表更新列表(linq)

    我有类 Data 的对象列表 如下所示 class Data int code string name DateTime date update 我还有另一个课程列表 例如 class RefCodes int old code int n
  • 如何调整 Windows 窗体以适应任何屏幕分辨率?

    我知道这是重复的问题 但我检查了所有其他相关问题 他们的答案没有帮助 结果仍然与屏幕截图 2 中所示相同 我是 C Windows 窗体新手 如截图1所示 我有Form1有一些控件 每组控件都放在一个面板中 我在 PC1 中设计了应用程序
  • 具有多个谓词的 C++11 算法

    功能如std find if来自algorithmheader 确实很有用 但对我来说 一个严重的限制是我只能为每次调用使用 1 个谓词count if 例如给定一个像这样的容器std vector我想同时应用相同的迭代find if 多个
  • DataGridView 列中的数字文本框

    我有一个DataGridView 我想要它的第一列或任何所需的列 其中有textboxes在其中 成为NUMERIC ONLY 我目前正在使用这段代码 private void dataGridViewItems EditingContro
  • 关闭整数的最右边设置位

    我只需要关闭最右边的设置位即可 我的方法是找到最右边位的位置 然后离开该位 我编写这段代码是为了这样做 int POS int n int p 0 while n if n 2 0 p else break n n 2 return p i
  • 判断串口是普通COM还是SPP

    我正在寻找一种方法来确定 COM 是标准 COM 还是 SPP COM 也称为 COM 设备的电缆替换蓝牙适配器 我有一个可以在 USB COM gt USB 和蓝牙下工作的设备 并且蓝牙接口可以与 SPP 一起工作 我目前正在使用Syst
  • C 类型命名约定,_t 或 ALLCAPS

    我一直想知道是否有任何命名约定 例如何时对类型使用全部大写以及何时追加 t 什么时候不使用任何东西 我知道当时 K R 发布了各种有关如何使用 C 的文档 但我找不到任何相关内容 在 C 标准库类型中 t看起来漂亮占主导地位 time t
  • 为什么 std::function 不是有效的模板参数,而函数指针却是?

    我已经定义了名为的类模板CallBackAtInit其唯一目的是在初始化时调用函数 构造函数 该函数在模板参数中指定 问题是模板不接受std function作为参数 但它们接受函数指针 为什么 这是我的代码 include
  • 如何增加ofstream的缓冲区大小

    我想增加 C 程序的缓冲区大小 以便它不会过于频繁地写入 默认缓冲区是 8192 字节 我尝试使用 pubsetbuf 将其增加到 200K 原始代码 ofstream fq fastq1 cstr ios out fastq1 is a
  • 从点云检测平面集

    我有一组点云 我想测试3D房间中是否有角落 所以我想讨论一下我的方法 以及在速度方面是否有更好的方法 因为我想在手机上测试它 我将尝试使用霍夫变换来检测线 然后我将尝试查看是否有三条线相交 并且它们也形成了两个相交的平面 如果点云数据来自深
  • 如何使用 C# 查询远程 MS ACCESS .mdb 数据库

    我正在尝试使用 C 查询 mote MS ACCESS 数据库 mdb 文件 将文件复制到本地计算机时可以成功查询它 我只想远程放置文件 所以我的客户端程序不包含原始数据 static string m path http www xyz
  • 如何在 EF Core 2.1 中定义外键关系

    我的 DAL 使用 EF Core 2 1 这就是我的模型的样子 一名用户只能拥有一种角色 Role entity kind of master public class Role public int RoleId get set pub
  • 使用单独的线程在java中读取和写入文件

    我创建了两个线程并修改了 run 函数 以便一个线程读取一行 另一个线程将同一行写入新文件 这种情况会发生直到整个文件被复制为止 我遇到的问题是 即使我使用变量来控制线程一一执行 但线程的执行仍然不均匀 即一个线程执行多次 然后控制权转移
  • 在 mvc4 中创建通用 mvc 视图

    我以前也提过类似的问题 没有得到答案 如何创建一个通用的 mvc4 视图 该视图可以显示传递给它的模型列表或单个模型 模型可以是个人 组织或团体 无论传递给它的是什么 如果您正在寻找类似的东西 model MyViewModel
  • 如何调用与现有方法同名的扩展方法? [复制]

    这个问题在这里已经有答案了 我有这样的代码 public class TestA public string ColA get set public string ColB get set public string ColC get se
  • 与 Entity Framework Core 2.0 的一对零关系

    我正在使用 C 和 NET Framework 4 7 将 Entity Framework 6 1 3 Code First 库迁移到 Entity Framework Core 我一直在用 Google 搜索 Entity Framew
  • 当 Verb="runas" 时设置 ProcessStartInfo.EnvironmentVariables

    我正在开发一个 C 应用程序 我需要创建变量并将其传递给新进程 我正在使用ProcessStartInfo EnvironmentVariables 新进程必须提升运行 因此我使用 Verb runas var startInfo new
  • 使用 boost 异步发送和接收自定义数据包?

    我正在尝试使用 boost 异步发送和接收自定义数据包 根据我当前的实现 我有一些问题 tcpclient cpp include tcpclient h include
  • 如何知道 HTTP 请求标头值是否存在

    我确信这很简单 但是却让我感到厌烦 我在 Web 应用程序中使用了一个组件 它在 Web 请求期间通过添加标头 XYZComponent true 来标识自身 我遇到的问题是 如何在视图中检查此组件 以下内容不起作用 if Request

随机推荐

  • PyQt5 选择将播放哪个音频设备输出

    这个简单的代码将有一个 GUI 按钮 按下该按钮就会播放example mp3到默认的音频输出设备 import sys from PyQt5 import QtCore QtMultimedia from PyQt5 QtMultimed
  • log4c 文档 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • CKeditor gem 生产模式问题

    我正在使用CKEditor 宝石 https github com galetahub ckeditor 我的配置为application js and routes rb如下 application js require ckeditor
  • 如何从任何地方运行 Cassandra (cqlsh)

    在 Cassandra 中官方文档 https wiki apache org cassandra GettingStarted https wiki apache org cassandra GettingStarted 它指出 启动服务
  • Hazelcast Jet 和 Node.JS 客户端序列化问题

    我有 Jet 0 6 作为备份 还有一些安装了 hazelcast nodejs client 0 8 0 的 Node JS 进程 我正在尝试推动从 Node 进程映射一个对象 该对象恰好反映了 Jet 端的类似对象 但是我不明白如何确保
  • hibernate 一对多使用连接表和 hibernate 注释

    我想使用连接表在两个表之间建立一对多关系 这就是我想使用连接表的原因 Hibernate 单向一对多关联 为什么连接表更好 https stackoverflow com questions 1307203 hibernate unidir
  • 如何从主 github 操作 yaml 文件引用另一个 yml 文件?

    我正在定义一个引用另一个 yaml 文件的 github 操作脚本 希望能够以更有条理的方式进行配置 这是我的工作文件 名为deploy yml在路径中 github workflows 其中第一个 是我的项目的根文件夹 jobs Unit
  • zend-framework 主义和 MVC 模式:模型和表单之间应该用什么样的层来连接数据?

    我正在学习 Zend Framework 和 Doctrine 我想知道将表单连接到模型的最佳实践是什么 反之亦然 在某些情况下 从表单类中的模型加载数据很方便 可以说是一个非常独特的类 它使用了许多模型 在其他情况下 在模型类中使用为表单
  • 二维 numpy 数组中第一个元素重复的平均条目

    我有一个看起来像这样的数组 arr np array 0 1 0 2 1 3 1 3 1 4 2 3 我想取具有相同第一个元素的 条目 的平均值 即我的输出应该是 0 avg 1 2 1 avg 3 3 4 2 3 最好的方法是什么 这是一
  • 寻找另一部智能手机的笛卡尔坐标?

    考虑到我有两部智能手机 A 和 B 如果我拿着智能手机 A 有没有办法确定 B 相对于我自己的位置 所以如果我们有这张图片的情况 它会告诉我 B 位于位置 2 1 利用 WiFi 信号强度来获取位置等创造性方法更受欢迎 我还可以确定两部手机
  • 将 SQL 转换为 LINQ to SQL

    我在将以下 SQL 转换为 LINQ to SQL 时遇到了很大的麻烦 有人能帮忙吗 SELECT dbo ExpensesGroup ExpenseGroupId dbo ExpensesGroup Title SUM dbo Expen
  • 如何更改 XAMPP apache 服务器端口?

    这是我的 Apache httpd conf 设置 Listen 8012 ServerName localhost 8012 每次我通过以下方式启动 ApacheXAMPP我看到这条消息 Status Check OK Busy Apac
  • 抓取 asp.net 页面时发生 EVENTVALIDATION 错误

    我需要从中获取一些值website http www uninor in UninorConnAssist locate a store Pages locate a store aspx 基本上我需要获取每个城市的面积 我为此使用 Pyt
  • PUT 中的 Azure Blob 存储文档中的“404 资源未找到”

    期间PUT请求 具有正确的授权标头 这会创建一个新的 BLOB 当我尝试执行以下操作时 我的进程收到 404 Resource Not Found 错误PUT将文件放入容器中 https accountNameHere blob core
  • 如何创建 C# 事件来处理来自 PostMessage() 的 MFC Windows 消息

    我有一个使用 WINSOCK 的托管 C DLL 接收时 它通过 PostMessage 向 CWnd 发送一条自定义消息 当从非托管 C 调用时 这可以正常工作 使用以下代码构建后 将目标 CWnd 注册到 C 类 Registers a
  • 如何在使用路径别名导入的文件上使用 Babel?

    我正在设置构建脚本 以便在我的网络应用程序的某些路由上进行服务器端渲染 我正在使用 React 和 Firebase 现在 我的项目结构是 root gt buildScripts Some build scripts to replace
  • ggpubr:在标签中显示显着性水平(*** 或 n.s.)而不是 p 值

    我想显示显着性水平 or n s 作为我的线性回归中的标签使用ggpubr在 R 中 这似乎是通过使用来完成的aes label p signif 如此处发布的 https www r bloggers com add p values a
  • 即使加载了 SqlP,也无法识别 invoke-sqlcmd

    我正在尝试创建一个 shell 脚本来运行查询并存储输出 到目前为止我的脚本如下所示 push location import module SqlPs Pop Location myData invoke sqlcmd InputFile
  • 如何在不同屏幕上显示相同的广告横幅?

    我已将 AdMob 横幅添加到应用程序的第一个屏幕 现在我需要它在其他一些屏幕上 不同的活动 如何在不重新加载横幅的情况下实现它以避免额外使用流量 Thanks 对于想要演示代码的人 我在我的应用程序中实现了它 使用一个Activity 多
  • 多线程安全消息队列

    这是我基本上拥有的 我有线程 A 定期检查消息并处理它们 线程B和C需要向A发送消息 当 B 和 C 或 B 或 C 尝试向 A 发送消息 而 A 正在处理消息并访问队列时 就会出现问题 这个问题通常是如何解决的 Thanks 这通常可以使