Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 两个期货之间的依赖关系_C++_Multithreading_Asynchronous_Concurrency_Future - Fatal编程技术网

C++ 两个期货之间的依赖关系

C++ 两个期货之间的依赖关系,c++,multithreading,asynchronous,concurrency,future,C++,Multithreading,Asynchronous,Concurrency,Future,请参阅下面的代码 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(); } 我的问题是,这个程序会在单线程软件/硬件上无限运行

请参阅下面的代码

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\u并发性显示为8,我不知道如何强制程序在单个线程上运行

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

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

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

流量将为:

  • 主线
  • f1线程开始---f1主体根据线程生命周期执行
  • f2线程开始---f2主体执行并设置条件
  • f2何时获得机会取决于线程调度和阻塞状态 例如:如果你在f1和f2有睡眠,你将有机会


    我很想看到其他人的答案

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