提升多线程和共享变量

时间:2012-11-04 12:54:00

标签: c++ multithreading variables boost shared

首先,如果这个问题已经存在,我很抱歉,但我的谷歌技能似乎让我失望。

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

我想使用以下内容检查收到的消息:

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

可悲的是,这似乎没有用。

我尝试将此“global_array”设置为volatile,但之后不会使用我用于接收的TCP函数。

我真的只需要这个工作..请,任何帮助将不胜感激。

编辑:“似乎无法正常工作” - >变量似乎没有改变,因为我陷入了这个循环

1 个答案:

答案 0 :(得分:3)

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

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

  1. 读取线程锁定互斥锁,保护对global_array的并发访问,并在有数据之前一直等待条件变量。
  2. 写入线程锁定互斥锁,将数据放入其中,解锁互斥锁,并发出条件变量信号。
  3. 我认为Boost有一个封装类似功能的类,我确信不同线程之间进行通信的队列代码已经发布到Stackoverflow。在Google上搜索“线程通信队列”会产生大量链接以从中获取灵感。