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 个线程也可能是一个问题。