gpt4 book ai didi

c++ - 在 vector 上放置背线

转载 作者:搜寻专家 更新时间:2023-10-31 00:29:52 25 4
gpt4 key购买 nike

为什么这会导致未定义的行为?

#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();
}

如果我将在注释行中创建线程,线程被复制/移动赋值,那么它很好,但为什么在创建线程时不起作用?

最佳答案

您的代码中发生的事情是您构建三个默认线程,然后再添加三个线程。

改变:

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();
}

spawn 中:

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_backpush_back时,你之前不能分配内存,因为那样会调用线程的构造函数。您应该保留它。

顺便说一句,因为你使用的是 emplace_back 而不是 push_back 你可以直接写:

threads.emplace_back(task);

关于c++ - 在 vector 上放置背线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39266461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com