但是,执行期间发生错误。
有什么问题,我该如何解决?
线程测试。
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个线程。[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个线程也可能是一个问题。