如何在C ++中的原始线程中执行回调?

时间:2015-04-08 16:22:06

标签: c++ multithreading lambda

在C ++中,我可以在一个线程中执行一个函数,并将一个将在原始线程中执行的lambda传递给这个函数吗?

class A
{
    void fA()
    {
        // thread 1
        boost::thread t(boost::bind(&A::fA, this, [=]() { /* code to execute in thread 1 */  }
    }

    void fB(const std::function<void()> &callback)
    {
        // thread 2

        how to execute 'callback' in the original thread (thread 1) ?
    }    
}

提前致谢。

2 个答案:

答案 0 :(得分:2)

您不能在另一个承载自己业务的现有线程上随意运行代码。正如@ bames53在他的回答中所说,你需要一些与这个线程合作的机制来向它提供任务,比如队列或你将完成这项任务的地方。

示例:

  • 线程1创建任务并将它们放在队列中;
  • 线程2从队列中获取任务并执行它们;

请注意,允许两个并发线程修改它们之间共享的变量是一种非常危险的做法,并且很可能会导致崩溃。要安全地执行此操作,必须使用互斥(互斥),这是一种保证线程不会同时访问共享变量的技术。

答案 1 :(得分:0)

考虑:

void thread1() {
  boost::thread t(blah, ... whatever);

  while (true) {
    std::cout << "working\n";
  }
}

这里产生的线程不能中断创建它的线程,并使它开始执行生成的线程想要的任何东西。如果上下文不负责生成一个线程并因此设置线程的入口点,那么让线程运行一些代码需要线程本身的合作。

例如,线程可能会持续处理工作项的队列。获得这样一个线程来运行代码只取决于将工作项放入队列中。

因此,如果您希望后台线程能够返回并在原始线程上执行某些代码,则需要设计原始线程以允许此操作。通常,这是如上所述以某种队列完成的。一些例子是Windows事件循环或OS X上的GCD中的dispatch_main()