c++ - boost 多线程和共享变量

标签 c++ multithreading variables boost shared

首先,如果这个问题已经出现在这里,我很抱歉,但我的 Google 技能似乎让我失望了。

基本上,我有一个函数可以随时检查任何传入的消息。还有一个全局变量应该存储此消息。 (我把这个函数放在一个线程中)

我想使用类似的方法检查收到的消息:

while (global_array[0] != '#') { } // all messages are padded with '#'

遗憾的是,这似乎不起作用。

我试着让这个“global_array”变易变,但它不会与我用于接收的 TCP 函数一起使用。

我真的只需要它来工作。请提供任何帮助。

编辑:“似乎不起作用”-> 变量似乎没有改变,因为我陷入了这个循环

最佳答案

在线程之间进行通信时,您需要某种形式的同步。使变量volatile不是表明该变量在不同线程之间使用的方法。它所做的只是防止编译器优化对该变量的访问,但除非您告诉它,否则 CPU 不会从缓存以外的任何地方开始读取任何内存的内容。也就是说,使用 volatile 只会让你的代码变慢(是的,我知道在某些平台上,编译器实现者选择将 volatile 与多线程原语 Hook 但是这样做通常被认为是一个坏主意)。

为了您描述的目的,您希望使用条件变量来保护对共享数据的访问:

  1. 读取线程锁定互斥锁以保护对您的 global_array 的并发访问,并一直等待条件变量直到有数据。
  2. 写入线程锁定互斥锁,将数据放入其中,解锁互斥锁,并向条件变量发出信号。

我认为 Boost有一个封装类似功能的类,我确信用于在不同线程之间进行通信的队列代码已发布到 Stackoverflow。在 Google 上搜索“线程通信队列”会产生大量链接以获取灵感。

关于c++ - boost 多线程和共享变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13218688/

相关文章:

javascript - 如何防止递归函数重新初始化累加变量?

c++ - sizeof(T) == sizeof(int) 吗?

c++ - 用项目 C++ 填充 QTreeview

C# - 我无法将我的进程输出转储到文件中

python - 变量循环和同步

java - 使用我的 JFrame 同时播放音乐

php - 我可以提取函数返回值吗?

c++ - 当相应的对象作为 const 传递时,我如何迭代一个 vector 作为类的成员

使用模板元编程的 C++ 数值解析器

c - Linux 中的多线程服务器