首页 > 解决方案 > 如何在 C++ 中启动多个线程?

问题描述

我有一些类对象,想把它们交给几个线程。线程数由命令行给出。

当我按照以下方式编写它时,它可以正常工作:

thread t1(thread(thread(tasks[0], parts[0])));
thread t2(thread(thread(tasks[1], parts[1])));
thread t3(thread(thread(tasks[2], parts[2])));
thread t4(thread(thread(tasks[3], parts[3])));
t1.join();
t2.join();
t3.join();
t4.join();

但正如我所提到的,线程数应该由命令行给出,所以它必须更加动态。我尝试了以下代码,但它不起作用,我不知道它有什么问题:

for(size_t i=0; i < threads.size(); i++) {
    threads.push_back(thread(tasks[i], parts[i]));
}
for(auto &t : threads) {
    t.join();
}

我希望有人对如何纠正它有一个想法。

标签: c++multithreading

解决方案


在本声明中:

thread t1(thread(thread(tasks[0], parts[0])));

您不需要将一个线程移动到另一个线程,然后将其移动到另一个线程。只需将您的任务参数直接传递给t1的构造函数:

thread t1(tasks[0], parts[0]);

t2t3和相同t4


至于你的循环:

for(size_t i=0; i < threads.size(); i++) {
    threads.push_back(thread(tasks[i], parts[i]));
}

假设您正在使用std::vector<std::thread> threads,那么您的循环填充threads错误。threads充其量,如果最初为空,则循环根本不会做任何事情,因为i < threads.size()size()==0. 在最坏的情况下,如果threads最初不是空的,那么循环将运行并threads.size()随着每次调用而不断增加threads.push_back(),从而导致无限循环,因为i < threads.size()永远不会为假,从而将越来越多的线程推入threads,直到内存爆炸。

尝试更多类似的东西:

size_t numThreads = ...; // taken from cmd line...
std::vector<std::thread> threads(numThreads);

for(size_t i = 0; i < numThreads; i++) {
    threads[i] = std::thread(tasks[i], parts[i]);
}
for(auto &t : threads) {
    t.join();
}

或这个:

size_t numThreads = ...; // taken from cmd line...
std::vector<std::thread> threads;
threads.reserve(numThreads);

for(size_t i = 0; i < numThreads; i++) {
    threads.emplace_back(tasks[i], parts[i]);
}
for(auto &t : threads) {
    t.join();
}

推荐阅读