提问者:小点点

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


我试图通过一个简单的实验来识别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;
}

共1个答案

匿名用户

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

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++std|thread|std|async|测试|正在进行|发生)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?