如果我从主线程启动一个线程,那么是否有任何选项可以挂起新线程将要触发的回调。回调应该在主线程中执行。
目前我正在使用未来来执行这个任务,但我希望避免等待结果(结果是布尔值,万一true一切正常,万一false需要重新启动线程来尝试执行任务)。在c++11中是否类似于node.js/javascript回调?
发布于 2014-04-27 23:34:20
在当前的标准C++中,没有什么可以显式地执行此操作。
std::future::then()正在标准化过程中,可能包含在C++1y或TR中。
有几个第三方图书馆支持这个成语:
关联:Asio是一个C++异步I/O库,它只支持非阻塞I/O操作,而不是一般的计算操作。(Node.js主要用于I/O,因此这可能足够了。)
否则,您可以使用自己的解决方案:
auto myFuture = std::async([](){
doWork();
}).share();
auto myNextFuture = std::async([=](){
myFuture.wait();
doMoreWork();
});您可以将其打包到可重用的助手中:
template <typename Future, typename Work>
auto after(Future f, Work w) -> std::future<decltype(w())>
{
return std::async([=]() -> decltype(w()) { f.wait(); return w(); });
}然后像这样使用它:
auto myFuture = std::async([](){
doWork();
});
auto myNextFuture = after(myFuture.share(), [](){
doMoreWork();
});使用这种方法,您需要支付额外线程的费用(可能)。
相关:C++并发 talk由Herb .
发布于 2014-04-28 08:15:36
如果您真的不需要在主线程中执行回调,那么Oktalist的延续实现列表列表就会做得很好。但是,如果这是一个要求,他们将是不够的。
如果您有一个事件循环正在运行(大多数GUI应用程序都有一个事件循环),您可以从延续中通知循环来执行回调。
在Qt中,您可以从延续内部向驻留在主线程中的对象发送信号。事件循环最终将执行主线程中的槽。
如果您没有事件循环boost协同可能是一种选择,但我没有使用他们自己。
发布于 2014-04-28 10:23:06
创建要在主线程中运行的任务队列。将其设置为多作者一读者线程安全(在CS文本或网络上有许多这方面的改进)。
当非空信号时,队列应触发信号,并允许读取器等待。
让您的线程在此队列中对任务进行排队。让主头头等着它。
如果主线程必须“同时”执行其他任务,则将这些任务排在同一个线程中。Ie,如果您响应用户输入,让用户输入读取线程抛出任务到该队列中,表示要处理的用户输入。
出于重复的原因,线程处理用户输入应该避免复杂的计算。
这种技术被称为“消息泵”--“主”线程服务于消息泵(任务队列),按顺序处理每条消息(排队任务)。在工业规模的应用程序中,每次发送抽象请求而不是显式任务,就会发生消息的元处理(回退处理程序等)。
您的“在主线程上运行”包括为主线程查询一条消息,该消息是“运行此任务”。
一个“传统的”C++程序的主线程不是消息泵,所以注入运行的代码是不可行的。大多数gui框架都有一个消息泵系统uou可以连接到其中。由于javascript是一种以ui为中心的语言,因此主头隐含地提供类似于消息泵的服务。
https://stackoverflow.com/questions/23329578
复制相似问题