【发布时间】: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