C ++ std :: thread和std :: async测试正在进行,但发生错误[关闭]

问题描述 投票:0回答:1
我正在尝试通过一个简单的实验来识别std :::: thread和std:async之间的区别。(请检查std :: async线程池功能)

但是,执行期间发生错误。

enter image description here

有什么问题,我该如何解决?

线程测试。

void for_print(int num) { for (int i = 0; i < 1000; i++) printf("%d Thread : %d\n", num, i); } int main(){ std::vector<std::thread> v_thread(2000); for (size_t i = 0; i < 2000; i++) v_thread.emplace_back(std::thread(for_print, i)); //join() for (size_t i = 0; i < 2000; i++) v_thread[i].join(); std::vector<std::thread>().swap(v_thread); return 0; }

异步测试

void for_print(int num) { for (int i = 0; i < 1000; i++) printf("%d async : %d\n", num, i); } int main() { std::vector<std::future<void>> v_async(2000); for (size_t i = 0; i < 2000; i++) v_async.emplace_back(std::async(std::launch::async, for_print, i)); for (size_t i = 0; i < 2000; i++) v_async[i].wait(); std::vector<std::future<void>>().swap(v_async); return 0; }

c++ stdthread stdasync
1个回答
2
投票
std::vector<std::thread> v_thread(2000); for (size_t i = 0; i < 2000; i++) v_thread.emplace_back(std::thread(for_print, i)); for (size_t i = 0; i < 2000; i++) v_thread[i].join();
这是错误的。您首先创建一个包含2000个“空”线程对象的向量,然后添加其他2000个“活动”线程,最后加入那些无法连接的前2000个线程。

[C0的情况也一样。

只需更改

std::async

std::vector<std::thread> v_thread(2000);

std::vector<std::thread> v_thread;

std::vector<std::future<void>> v_async(2000);


OT:这些行:

std::vector<std::future<void>> v_async;

std::vector<std::thread>().swap(v_thread);
return 0;
的结尾是完全多余的。


编辑

还要注意,系统通常对正在运行的线程数有一些限制。因此,在这种情况下,创建2000个线程也可能是一个问题。
© www.soinside.com 2019 - 2024. All rights reserved.