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

How to execute a callback in the original thread in C++?

在 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) ?
    }    
}

提前致谢。

考虑:

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

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

此处生成的线程不能只中断创建它的线程并使其开始执行生成的线程想要的任何内容。如果上下文不负责生成线程并因此设置线程的 'entry point',则将线程设置为 运行 一些代码需要线程本身的合作。

例如,线程可能连续处理工作项队列。让这样的线程进入 运行 代码仅取决于将工作项放入队列中。

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

您不能任意运行在另一个承载自己业务的现有线程上编写代码。正如@bames53 在他的回答中所述,您需要与此线程有某种合作机制来向它传递任务,例如队列或您将放置此任务的某个地方。

示例:

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

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