【问题标题】:Boost thread finished callback availableBoost线程完成回调可用
【发布时间】:2016-06-06 21:30:23
【问题描述】:

我正在寻找一种在 boost 线程(boost 版本 1.60、普通线程、无线程组或池)完成时调用回调函数的方法。我读过这个

How can I tell reliably if a boost thread has exited its run method?

但我需要某种回调。知道怎么做吗?我必须创建某种条件变量吗?

感谢您的帮助!

【问题讨论】:

  • boost::thread 整理上没有定义回调。相反,您可以加入线程,然后自己调用任何您想要的回调。
  • 感谢您的回复。我猜是这样。我想我最终会继续这样做,或者创建一个条件变量。谢谢!
  • 我不明白这个问题?如果您想知道线程何时通过回调完成,请让它在退出之前将您的回调事物作为最后一行调用。
  • 另外两个线程在等待一个中间结果,就是这种情况。我决定使用 condVar 解决方案。易于实施且运行良好。

标签: c++ multithreading boost callback


【解决方案1】:

最简单的解决方案是包装你原来的线程函数:

#include <boost/thread.hpp>
#include <iostream>

void callback()
{
    std::cout << "callback invoked" << std::endl;
}

void orig_thread_func()
{
    std::cout << "thread function invoked" << std::endl;
}

void wrapper(void (*func)())
{
    func();        // invoke your original thread function
    callback();    // invoke callback
}

int main()
{
    boost::thread t(&wrapper, &orig_thread_func);
    t.join();
    return 0;
}

【讨论】:

    【解决方案2】:

    也许你需要一个像atexit 这样在进程退出时注册回调的接口。

    所以使用at_thread_exit,见this_thread.atthreadexit

    用法:

    void thread_exit_callback(){
      std::cout <<"thread exit now!" <<std::endl;
    }
    
    void thread_func(){  
      boost::this_thread::at_thread_exit(thread_exit_callback);
    }
    
    int main() {
      boost::thread t(thread_func);
      ...
      return 0;
    }
    

    【讨论】:

    • 认真的吗?在发布近三年后回答这个问题?同时,考虑到 c++ 17 的特性,我什至不会再将 Boost 用于线程......
    • 您没有更新您不再使用boost::thread 的问题。也许其他人也有同样的问题。
    猜你喜欢
    • 2015-04-06
    • 1970-01-01
    • 2011-06-05
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多