更改boost线程中的静态变量
changing static variable in boost thread
我使用boost线程来运行opengl函数,我的主线程旨在通过标准输入和输出与外部程序进行通信。原因是,一旦opengl进入主循环,它就永远不会离开,但我需要一种方法来读取输入,同时不阻塞渲染。一旦程序接收到输入,主程序就会通过静态成员(简单地更改值)与opengl线程进行通信
class ARGraphicController
{
public:
ARGraphicController(int sw, int sh);
~ARGraphicController();
//...
void start(int argc, char *argv[]);
static void changeGen();
static bool genMove;
private:
//..
};
bool ARGraphicController::genMove;
void ARGraphicController::start(int argc, char *argv[])
{
//opengl initialization
//./
glutMainLoop();
}
这是我的主要
void main()
{
graphic_handler = new boost::thread(boost::bind(&ARGraphicController::start, &graphic_controller, argc, argv));
string command_line;
while(1)
{
getline(cin, command_line);
//process input command
//...
//...
if(command == "genmov"){
//change static variable to true
graphic_controller.changeGen();
while(1)
{
//until the thread change the static variable back to false
if(!graphic_controller.genMove)
{
//...
break;
}
}
}
}
delete graphic_handler;
}
我不明白的是,如果我这样做,changeGen()不会改变静态变量的值:
void ARGraphicController::changeGen()
{
genMove = true;
}
但是当我添加std::cout时,值会发生变化。。
void ARGraphicController::changeGen()
{
genMove = true;
std::cout<<"value is changed :)"<<std::endl;
}
我怀疑这与静态成员变量(本质上是全局变量)不是线程安全的事实有关?如果是,我该如何解决此问题?或者有更好的方法来设计我的应用程序,以便在我的main和thread之间进行通信吗?
感谢
欢迎来到内存排序的奇妙世界。
这里的问题是,在您当前的设置中,您无法保证写入的值何时对其他线程可见。任何编译器、CPU、缓存或内存控制器(可能还有其他)都可以在此处插入优化,以防止更改在第二个线程中可见。除此之外,你还有一场数据竞赛。对bool的非同步访问在大多数现代架构上都有效,但在其他架构上可能会恶意中断。在ISO-C++11中,这样的数据竞争会立即导致未定义的行为。
解决方案是利用线程库。这里最简单的修复方法是简单地为静态变量使用atomic<bool>
。这将同时解决订购和访问问题。或者,考虑消息传递原语之一:
- 使用
boost::future
发出一次性事件的信号 - 使用
boost::condition_variable
来通知线程可以等待的重复出现的条件(生产者-消费者是这里的突出示例) - 在发送大量统一消息时,使用boost.lockfree中的无锁定队列在线程之间建立数据流
相关文章:
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 模板基类中的静态变量
- 类和静态变量
- 不同作用域中的静态变量和全局变量
- 静态变量声明和定义
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 在类中继承静态变量?
- "local scope"中的 C++ 初始化静态变量
- 使用静态变量的递归调用的不同输出
- 复制文件流C++静态变量
- 跨模板化函数编译的静态变量
- C++编译器是否优化了顺序静态变量读取?
- C++,每个循环初始化一个新的静态变量
- (为什么)我们可以在初始化中将非静态类成员分配给静态变量吗?
- 这些语句是否等效(静态变量、常量变量和泛型)
- 程序如何知道静态变量是否需要初始化?
- 类外的静态变量实例化
- 无法解析静态变量
- 函数局部静态变量:从性能角度来看的优点/缺点
- 访问从 CPP 文件到其他头文件的静态变量