c++ Boost:从父线程调用函数

C++ Boost: call function from parent thread

本文关键字:线程 调用 函数 Boost c++      更新时间:2023-10-16

我试图让一个线程回调创建线程的对象的函数。但似乎不可能将"this"作为参数传递。有办法实现这一点吗?提前谢谢。

Helper.cpp

void Helper::ProcessSomething(void (*callback)(void))
{
    boost::this_thread::sleep(boost::posix_time::seconds(1));
    callback();
}

SomeClass.cpp

void SomeClass::Start(void)
{
    Helper *helper = Helper();
    boost::thread t(&Helper::ProcessSomething, helper, &this->SomeCallback);
    t.join();
}
void SomeClass::SomeCallback(void)
{
    std::cout << "Callback called" << std::endl;
}

问题是SomeCallback不是静态的(至少不是我能看到的),所以在thread的构造函数中有另一个this。此外,因为它不是静态的,所以您不能将SomeCallback转换为ProcessSomething所需的void(*)(void)

最简单的修复就是将SomeCallback设置为静态(并将&this->SomeCallback更改为&SomeClass::SomeCallback)。但如果你不能,这是一个可能的解决方案(我假设你没有c++ 11):

void Helper::ProcessSomething(boost::function<void()> callback)
{
    boost::this_thread::sleep(boost::posix_time::seconds(1));
    callback();
}
// ...
void SomeClass::Start(void)
{
    Helper *helper = Helper();
    boost::function<void()> callback = boost::bind(&SomeClass::SomeCallback, this);
    boost::thread t(&Helper::ProcessSomething, helper, callback);
    t.join();
}

如果你有c++ 11(但无论如何都想使用boost::thread),你可以使用lambda而不是绑定:

void SomeClass::Start(void)
{
    Helper *helper = Helper();
    boost::thread t(&Helper::ProcessSomething, helper, [this]() { SomeCallback(); });
    t.join();
}