释放模式下的boost线程崩溃

boost thread crash on release mode

本文关键字:线程 崩溃 boost 模式 释放      更新时间:2023-10-16

我是boost的新手,尝试在单独的线程中实现自由函数、静态函数和成员函数。它在调试模式下运行良好,但在发布模式下会崩溃。通常它意味着未初始化的数组或值,但我找不到问题所在。。

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传递字符串
  • 我不再使用增强绑定
  • 您仍然可以直接使用cout,所以如果您想防止它在编译时,您需要在一个单独的单元(.h+.cpp)中声明日志函数,并删除主程序的#include <iostream>

希望能有所帮助,