在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) ?
}
}
提前致谢。
答案 0 :(得分:2)
您不能在另一个承载自己业务的现有线程上随意运行代码。正如@ bames53在他的回答中所说,你需要一些与这个线程合作的机制来向它提供任务,比如队列或你将完成这项任务的地方。
示例:
请注意,允许两个并发线程修改它们之间共享的变量是一种非常危险的做法,并且很可能会导致崩溃。要安全地执行此操作,必须使用互斥(互斥),这是一种保证线程不会同时访问共享变量的技术。
答案 1 :(得分:0)
考虑:
void thread1() {
boost::thread t(blah, ... whatever);
while (true) {
std::cout << "working\n";
}
}
这里产生的线程不能中断创建它的线程,并使它开始执行生成的线程想要的任何东西。如果上下文不负责生成一个线程并因此设置线程的入口点,那么让线程运行一些代码需要线程本身的合作。
例如,线程可能会持续处理工作项的队列。获得这样一个线程来运行代码只取决于将工作项放入队列中。
因此,如果您希望后台线程能够返回并在原始线程上执行某些代码,则需要设计原始线程以允许此操作。通常,这是如上所述以某种队列完成的。一些例子是Windows事件循环或OS X上的GCD中的dispatch_main()
。