首先,如果这个问题已经出现在这里,我很抱歉,但我的 Google 技能似乎让我失望了。
基本上,我有一个函数可以随时检查任何传入的消息。还有一个全局变量应该存储此消息。 (我把这个函数放在一个线程中)
我想使用类似的方法检查收到的消息:
while (global_array[0] != '#') { } // all messages are padded with '#'
遗憾的是,这似乎不起作用。
我试着让这个“global_array
”变易变,但它不会与我用于接收的 TCP 函数一起使用。
我真的只需要它来工作。请提供任何帮助。
编辑:“似乎不起作用”-> 变量似乎没有改变,因为我陷入了这个循环
最佳答案
在线程之间进行通信时,您需要某种形式的同步。使变量volatile
不是表明该变量在不同线程之间使用的方法。它所做的只是防止编译器优化对该变量的访问,但除非您告诉它,否则 CPU 不会从缓存以外的任何地方开始读取任何内存的内容。也就是说,使用 volatile
只会让你的代码变慢(是的,我知道在某些平台上,编译器实现者选择将 volatile
与多线程原语 Hook 但是这样做通常被认为是一个坏主意)。
为了您描述的目的,您希望使用条件变量来保护对共享数据的访问:
- 读取线程锁定互斥锁以保护对您的
global_array
的并发访问,并一直等待条件变量直到有数据。 - 写入线程锁定互斥锁,将数据放入其中,解锁互斥锁,并向条件变量发出信号。
我认为 Boost有一个封装类似功能的类,我确信用于在不同线程之间进行通信的队列代码已发布到 Stackoverflow。在 Google 上搜索“线程通信队列”会产生大量链接以获取灵感。
关于c++ - boost 多线程和共享变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13218688/