【问题标题】:Dependency between 2 futures2 个期货之间的依赖关系
【发布时间】:2018-06-11 09:41:01
【问题描述】:

请看下面的代码。

int cond = true;

void f1()
{
     while(cond)
     {

     }
}

void f2()
{
     cond  = false;
}

int main()
{
     auto fut1 = std::async(f1);
     auto fut2 = std::async(f2);
     fut1.get();
     fut2.get();
}

我的问题是,这个程序会在单线程软件/硬件上无限运行吗? 我无法对此进行测试,因为我的 std::hardware_concurrency 显示为 8,而且我不知道强制程序在单个线程上运行的方法。

【问题讨论】:

  • 这个程序有UB,不管任何线程数。您在cond 上进行了一场比赛。
  • 使cond原子化,然后答案是否定的;但我认为您应该对线程问题和同步进行更多研究
  • 但是 fut1.get() 会阻塞直到 f1 返回正确?
  • @EduardRostomyan UB 表示任何事情都有可能发生。从您发布的内容来看,编译器可能会完全取消对f1 的调用,因为它没有任何效果;或者它可能会假设 cond 永远不会改变并且总是可以假设为 true。
  • get 仅在结果不可用时才阻塞,如果线程已经完成,则 get 基本上只是返回值。未来只是保存结果,但不确保线程以任何顺序执行

标签: c++ multithreading asynchronous concurrency future


【解决方案1】:

这个程序不会无限运行,一旦 f2() 被第二个线程调用,它会将 cond 设置为 false

根据Async的定义: 模板函数 async 异步运行函数 f(可能在一个单独的线程中,该线程可能是线程池的一部分)并返回一个 std::future,它最终将保存该函数调用的结果。

有3个线程 主线程: f1 线程: f2 线程:

流程将是:

  1. 主线程
  2. f1线程启动---f1体根据线程生命周期执行
  3. f2 线程启动 --- f2 主体执行并设置 cond

f2何时获得机会取决于线程调度和阻塞状态 例如:如果你在 f1 和 f2 中睡觉会有机会

我很想看看其他人的答案

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 2016-09-10
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多