我是 boost 的新手,试图在单独的线程中实现自由函数、静态函数和成员函数。它在 Debug模式下运行良好,但在 Release模式下崩溃。通常这意味着未初始化的数组或值,但我找不到问题..
class test {
public:
static void func2() {
cout<< "function2"<<endl;
}
void func3(string msg) {
cout<<msg<<endl;
}
void operate() {
// Constructs the new thread and runs it. Does not block execution.
thread t2(&test::func2); // static function
thread t3(boost::bind(&test::func3,this,"function3")); // member function
//Makes the main thread wait for the new thread to finish execution, therefore blocks its own execution.
t2.join();
t3.join();
}
};
void func1(string msg) {
cout<<msg<<endl;
}
int main() {
test example;
example.operate();
thread t1(&func1,"function1"); // free function
t1.join();
return 0;
}
最佳答案
一个简单的解决方法是使用互斥体来保证您只使用 cout 一次。
std::mutex mut;
void log(const std::string& ref)
{
std::lock_guard<std::mutex> lock(mut);
std::cout<<ref<<std::endl;
}
那么你的代码应该是这样的。
class test {
public:
static void func2() {
log("function2");
}
void func3(const std::string & msg) {
log(msg);
}
void operate() {
// Constructs the new thread and runs it. Does not block execution.
std::thread t2(&test::func2); // static function
std::thread t3(&test::func3,this,"function3"); // member function
//Makes the main thread wait for the new thread to finish execution, therefore blocks its own execution.
t2.join();
t3.join();
}
};
注意三点:
- 我正在通过 const ref 传递字符串
- 我不再使用 boost bind
- 你仍然可以直接使用 cout,所以如果你想阻止它编译时间,你需要在一个单独的单元 (.h + .cpp) 中声明日志函数并删除
#include <iostream>
主程序
希望对你有帮助,
关于c++ - 在 Release模式下 boost 线程崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25513547/