我试图通过一个简单的实验来识别std::::Thread和std:Async之间的区别。(检查std::Async线程池功能)
但是,在执行过程中会发生错误。
问题出在哪里,怎么解决?
螺纹试验。
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;
}
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个线程,这些线程是不可连接的。
在std::async
的情况下也是如此。
只要改变
std::vector<std::thread> v_thread(2000);
至
std::vector<std::thread> v_thread;
和
std::vector<std::future<void>> v_async(2000);
至
std::vector<std::future<void>> v_async;
OT:这些行:
std::vector<std::thread>().swap(v_thread);
return 0;
末尾的main
是完全多余的。
编辑
还要注意,系统通常对运行线程的数量有一些限制。 因此,在此上下文中创建2000个线程可能也是一个问题。