如果你想要一个函数在主线程中运行,你将不得不实现某种类型的消息传递系统。因此,例如,您将启动您的主线程,然后启动工作线程。工作线程可以完成工作,而主线程将等待工作线程的返回值(即主线程将检查消息队列或其他特性)。当工作线程完成时,它将通过指向它想让主线程运行的函数的指针传递给主线程的消息队列的结构(即消息)。您的邮件可以很简单:
struct message
{
typedef void (*func_ptr)(void); //or whatever your function signature would be
func_ptr function;
bool finished;
message(): function(NULL), finished(false) {}
};
因此,当工作线程完成后,它会创建一个新的消息,初始化消息中的函数指针,并推动该消息返回到队列,主线程是等待。主线程然后从队列中读取消息,并调用该函数。
顺便说一句,使主线程“等待”而不必将其保留在循环中并消耗CPU周期的有效方法是在主线程和工作者之间使用信号量或条件变量(如boost::condition
) 。
与一个或多个音符......一个“消息队列”是一个简单的std::queue<message>
用适当的锁定访问主线程读取,并辅助线程写入。对于主线程写入的工作线程,也可以有另一个消息队列,如果需要线程之间的双向通信,则工作线程将读取。
你正在寻找一个消息队列。 – 2011-05-20 11:48:09
当然,如果你睡在主线程上,你会阻塞主线程。你还会期待什么?睡觉不能像广告一样工作? – 2011-05-20 11:58:33
(另外,抱歉,我的意思是[消息泵(http://en.wikipedia.org/wiki/Event_loop))。 – 2011-05-20 11:59:56