为什么会导致未定义的行为?
#include <iostream>
#include <thread>
#include <vector>
std::vector<std::thread> threads(3);
void task() { std::cout<<"Alive\n";}
void spawn() {
for(int i=0; i<threads.size(); ++i)
//threads[i] = std::thread(task);
threads.emplace_back(std::thread(task));
for(int i=0; i<threads.size(); ++i)
threads[i].join();
}
int main() {
spawn();
}
如果我将创建线程,如在注释行中线程被复制/移动赋值那么它很好,但为什么在创建线程时不起作用?
答案 0 :(得分:5)
您的代码中正在构建三个默认线程,然后添加其他3个线程。
变化:
std::vector<std::thread> threads(3);
要:
std::vector<std::thread> threads;
const size_t number_of_threads=3;
int main(){
threads.reserve(number_of_threads);
spawn();
}
在spwan
内:
void spawn() {
for(int i=0; i<number_of_threads; ++i){
threads.emplace_back(std::thread(task));
}
for(int i=0; i<threads.size(); ++i){
threads[i].join();
}
}
使用emplace_back
或psuh_back
时,不得先分配内存。你应该只reserve
。
BTW,因为您使用emplace_back
而非push_back
,您可以直接写信:
threads.emplace_back(task);