gpt4 book ai didi

c++ - 将 std::async 与 std::launch::async 一起使用时的奇怪行为

转载 作者:行者123 更新时间:2023-11-28 04:33:28 28 4
gpt4 key购买 nike

我正在努力思考 C++11 中引入的 std::asyncstd::futures

#include <iostream>
#include <list>
#include <functional>
#include <vector>
#include <algorithm>
#include <thread>
#include <unistd.h>
#include <string>
#include <future>

using namespace std;

int hog_cpu()
{
cout << "hog_cpu" << endl;
volatile unsigned long long i = 0;
for(i = 0; i < 1000000000ULL ; i++);
return 50;
}

int hog_cpu_ex()
{
cout << "hog_cpu_ex" << endl;
volatile unsigned long long i = 0;
for(i = 0; i < 1000000000ULL ; i++);
return 500;
}

int main()
{
cout << "start threads asynchronously" << endl;

std::future<int> f1 = std::async(std::launch::async, hog_cpu);

std::future<int> f2 = std::async(std::launch::async, hog_cpu_ex);

cout << "Get the Results" << endl;

int r1 = f1.get();

int r2 = f2.get();

cout << "result 1: " << r1 << endl;
cout << "result 2: " << r2 << endl;

return 0;
}

我得到的上述程序的输出如下所示。

start threads asynchronously
Get the Results
hog_cpu_ex
hog_cpu
result 1: 50
result 2: 500

Process finished with exit code 0

我的问题是因为我使用 std::launch::async 执行应该立即使用另一个线程开始。输出告诉我它打印 Get the results 行,然后只开始执行。 (从上面的日志可以看出)。此外,hog_cpu_exhog_cpu 之前启动。有人可以解释为什么会发生这种情况。

最佳答案

当你做的时候

std::future<int> f1 = std::async(std::launch::async, hog_cpu);

std::future<int> f2 = std::async(std::launch::async, hog_cpu_ex);

您启动了另外两个执行线程。然后主线程在它调用每一行之后继续运行,直到它命中才会停止

int r1 = f1.get();

如果 f1 还没有完成。由于主线程一直在运行并且启动一个线程需要一些时间,因此在线程启动之前看到 Get the Results 打印是非常合理的。

至于为什么会看到

hog_cpu_ex
hog_cpu

而不是相反是由于您的操作系统。它可以控制哪些线程运行以及何时运行,因此很可能它会将 f1 置于休眠状态,为 f2 提供空间,因此它开始运行,然后启动 f1 之后的某个时间。

关于c++ - 将 std::async 与 std::launch::async 一起使用时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52211866/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com