c ++ boost :: thread在主线程上执行代码?

The*_*uad 10 c++ boost-thread

在调用boost :: thread运行一些指令后,是否有可能回到主线程?

我的代码基于proactor模式,但是某个函数可能需要一些时间,所以为了不阻塞整个程序,我正在创建一个运行这个函数的线程.当这个函数结束时,我需要调用另一个函数,但它必须在主线程上运行.我有一个连接池,这不是线程安全的,我真的想避免互斥.

有没有一种稳定的方法在主线程上运行一个函数(在另一个线程上调用)?

就像在ObjectiveC performSelectorOnMaintThread中一样

Jas*_*son 5

如果您希望函数在主线程中运行,那么您将不得不实现某种类型的消息传递系统.例如,您将启动主线程,然后启动工作线程.工作线程将完成它的工作,而主线程将等待来自工作线程的一些返回值(即主线程将检查消息队列或那种性质的东西).当工作线程完成时,它将向主线程的消息队列传递一个结构(即消息),该结构具有指向它希望主线程运行的函数的指针.您的消息可以非常简单:

struct message
{
    typedef void (*func_ptr)(void); //or whatever your function signature would be

    func_ptr function;
    bool finished;

    message(): function(NULL), finished(false) {}
};
Run Code Online (Sandbox Code Playgroud)

因此,当工作线程完成时,它将创建一条新消息,初始化消息中的函数指针,并将该消息推回到主线程正在等待的队列中.然后主线程从队列中读取消息,并调用该函数.

BTW,以及使主线程"等待"而不必将其保持在循环中并且耗尽CPU周期的有效方法是boost::condition在主线程和工作线程之间使用信号量或条件变量(如).

还有一个注意事项......"消息队列"只是一个std::queue<message>具有适当锁定访问权限的主线程读取,工作线程写入.主线程还可以为工作线程写入另一个消息队列,如果需要线程之间的双向通信,则工作线程会读取.


seh*_*ehe 2

我想你可能想研究一下boost asiostrands。它们会让您指定要在哪个线程(股线)上执行某些操作,并且它将自动在该股线上排队。

请注意,股线实际上更像是纤维(意味着:如果股线多于实际线程,则股线将多路复用到可用线程上)。

IIRC 但这不会给您机会明确指定主线程1。然而,这通常不是实际的要求:strand 让您轻松做的是确保strand 中的操作在同一个逻辑线程上运行,即strand 中不可能存在并发。

琐事:Boost Asio io_service.run()是消息泵的一个示例

以下是 Boost Asio 的示例页面:http://www.boost.org/doc/libs/1_40_0/doc/html/boost_asio/examples.html