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