首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在c++11中,线程是否与node.js/javascript回调类似?

在c++11中,线程是否与node.js/javascript回调类似?
EN

Stack Overflow用户
提问于 2014-04-27 22:00:22
回答 3查看 377关注 0票数 3

如果我从主线程启动一个线程,那么是否有任何选项可以挂起新线程将要触发的回调。回调应该在主线程中执行。

目前我正在使用未来来执行这个任务,但我希望避免等待结果(结果是布尔值,万一true一切正常,万一false需要重新启动线程来尝试执行任务)。在c++11中是否类似于node.js/javascript回调?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-27 23:34:20

在当前的标准C++中,没有什么可以显式地执行此操作。

std::future::then()正在标准化过程中,可能包含在C++1y或TR中。

有几个第三方图书馆支持这个成语:

  • Boost.Thread
  • 英特尔线程构建块(TBB)
  • OpenMP
  • 仅限Microsoft 并行模式库(PPL)
  • 微软卡萨布兰卡

关联:Asio是一个C++异步I/O库,它只支持非阻塞I/O操作,而不是一般的计算操作。(Node.js主要用于I/O,因此这可能足够了。)

否则,您可以使用自己的解决方案:

代码语言:javascript
复制
auto myFuture = std::async([](){
    doWork();
}).share();
auto myNextFuture = std::async([=](){
    myFuture.wait();
    doMoreWork();
});

您可以将其打包到可重用的助手中:

代码语言:javascript
复制
template <typename Future, typename Work>
auto after(Future f, Work w) -> std::future<decltype(w())>
{
    return std::async([=]() -> decltype(w()) { f.wait(); return w(); });
}

然后像这样使用它:

代码语言:javascript
复制
auto myFuture = std::async([](){
    doWork();
});
auto myNextFuture = after(myFuture.share(), [](){
    doMoreWork();
});

使用这种方法,您需要支付额外线程的费用(可能)。

相关:C++并发 talk由Herb .

票数 5
EN

Stack Overflow用户

发布于 2014-04-28 08:15:36

如果您真的不需要在主线程中执行回调,那么Oktalist的延续实现列表列表就会做得很好。但是,如果这是一个要求,他们将是不够的。

如果您有一个事件循环正在运行(大多数GUI应用程序都有一个事件循环),您可以从延续中通知循环来执行回调。

在Qt中,您可以从延续内部向驻留在主线程中的对象发送信号。事件循环最终将执行主线程中的槽。

如果您没有事件循环boost协同可能是一种选择,但我没有使用他们自己。

票数 2
EN

Stack Overflow用户

发布于 2014-04-28 10:23:06

创建要在主线程中运行的任务队列。将其设置为多作者一读者线程安全(在CS文本或网络上有许多这方面的改进)。

当非空信号时,队列应触发信号,并允许读取器等待。

让您的线程在此队列中对任务进行排队。让主头头等着它。

如果主线程必须“同时”执行其他任务,则将这些任务排在同一个线程中。Ie,如果您响应用户输入,让用户输入读取线程抛出任务到该队列中,表示要处理的用户输入。

出于重复的原因,线程处理用户输入应该避免复杂的计算。

这种技术被称为“消息泵”--“主”线程服务于消息泵(任务队列),按顺序处理每条消息(排队任务)。在工业规模的应用程序中,每次发送抽象请求而不是显式任务,就会发生消息的元处理(回退处理程序等)。

您的“在主线程上运行”包括为主线程查询一条消息,该消息是“运行此任务”。

一个“传统的”C++程序的主线程不是消息泵,所以注入运行的代码是不可行的。大多数gui框架都有一个消息泵系统uou可以连接到其中。由于javascript是一种以ui为中心的语言,因此主头隐含地提供类似于消息泵的服务。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23329578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档