C++ std::thread 和 std::async 测试正在进行中,但出现错误
C++ std::thread and std::async tests are in progress, but an error occurs
我试图通过一个简单的实验来确定 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 "empty" 个线程对象的向量,然后添加额外的 2000 个 "living" 个线程,最后加入前 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 个线程也可能是一个问题。
我试图通过一个简单的实验来确定 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 "empty" 个线程对象的向量,然后添加额外的 2000 个 "living" 个线程,最后加入前 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 个线程也可能是一个问题。