c++ - 如何在 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();
}
我希望有人对如何纠正它有一个想法。
解决方案
在本声明中:
thread t1(thread(thread(tasks[0], parts[0])));
您不需要将一个线程移动到另一个线程,然后将其移动到另一个线程。只需将您的任务参数直接传递给t1
的构造函数:
thread t1(tasks[0], parts[0]);
与t2
、t3
和相同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();
}
推荐阅读
- linux - Linux 与 Windows 中的系统库
- c# - 根据用户对一系列问题的回答隐藏 Word 文档中的部分
- javascript - 使用用户名获取文档参考
- c - 在 C99 的除法中使用指针,错误:二进制操作数无效
- java - 无法通过 Dockerized WebLogic 将 Debug 设置为适用于 Java,而不是使用 intelliJ 或 Studio Code
- twitter-bootstrap-3 - Bootstrap col-6 col-md-4 在手机上不起作用
- python - FileNotFoundError:[Errno 2] 没有这样的文件或目录:'tinycss2\\VERSION'
- react-native - 使用本机反应的任务:app:validateSigningRelease FAILED(未找到签名配置'release'。)
- java - 交换 LinkedList 中的项目,因此较小的值优先
- sql - 使用 Pandas 从数据库读取时,有没有办法排除表名?