首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于任务的异步并发

基于任务的异步并发
EN

Stack Overflow用户
提问于 2015-12-22 10:26:45
回答 1查看 905关注 0票数 0
代码语言:javascript
复制
int
main()
{
  std::mutex io;
  std::vector<std::future<void>> futures;
  std::cout << "Main id: " << std::this_thread::get_id() << std::endl;
  for (int i = 0; i < 12; ++i) {
    std::future<void> f = std::async(std::launch::async, [&]{
      std::this_thread::sleep_for(std::chrono::seconds(10));
      io.lock();
      std::cout << "Thread id: " << std::this_thread::get_id() << std::endl;
      io.unlock();
    });
    futures.push_back(std::move(f));
  }
  for (auto& f : futures) {
    f.wait();
  }
}

我在几个博客上读到,我不能使用async进行基于任务的并发,因为它不能在线程上均匀地分发tasks,所以我创建了一个小的测试程序。

代码语言:javascript
复制
Main id: 140673289357120
Thread id: 140673241089792
Thread id: 140673215911680
Thread id: 140673232697088
Thread id: 140673224304384
Thread id: 140673207518976
Thread id: 140673199126272
Thread id: 140673165555456
Thread id: 140673190733568
Thread id: 140673173948160
Thread id: 140673182340864
Thread id: 140673157162752
Thread id: 140673148770048

但是输出并不是我所期望的。我的机器有两个超线程内核,它给了我4个线程,但是从线程ids来看,它们似乎都是独一无二的。

异步可以用于基于任务的并发吗?

this_thread::get_id()到底返回了什么?

所谓基于任务的并发性,我的意思是工作将在所有可用线程之间平均分配。

EN

回答 1

Stack Overflow用户

发布于 2018-10-15 05:50:44

12个唯一的线程ids指的是软件线程,而不是硬件线程。在Windows上的任务管理器面板(7或10)中,我看到了数以千计的线程,这些线程又是基于时间切片在可用硬件线程上并发执行的软件线程。

异步适用于基于任务的并发。这方面存在以下一些问题:

  1. 如果未指定启动策略,则无法保证任务将在单独的线程中执行。实现可以选择在同一线程中执行任务,这取决于某些条件(例如,过多的线程)。
  2. 如果异步调用(future<>)的返回值未被捕获,则将立即阻止当前线程的执行。它和串行程序是一样的。即使指定了异步策略,也会发生这种情况。
  3. 异步返回的future<>的析构函数将阻止执行(如果异步调用的执行未完成)。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34413602

复制
相关文章

相似问题

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