_threads.emplace_back(std::thread(&thread_pool::work, this, (int)i));
时间: 2024-01-15 13:05:00 浏览: 39
这段代码是在使用线程池的时候创建线程的部分。首先,`_threads`是一个线程容器,用来存放线程对象。`emplace_back`函数用于在容器的末尾创建一个新的线程对象。在这里,使用了`std::thread`来创建线程,并传入了线程函数`work`作为参数,同时还传递了当前线程池对象的指针和索引`i`作为参数。
整体来看,这段代码的作用是创建了一个新的线程,并将其添加到线程池的线程容器中。每个线程都会执行线程池的`work`函数,并根据传递的索引来处理相应的任务。
相关问题
note: suggested alternative: ‘mem_fun’ std::for_each(template_threads.begin(), template_threads.end(), std::mem_fn(&std::thread::join));
这个错误提示建议你可以考虑使用`std::mem_fun`作为`std::for_each`的第三个参数,而不是使用`std::mem_fn`。
`std::mem_fun`也是一个函数对象,可以将一个成员函数转换为一个可调用对象。但与`std::mem_fn`不同的是,`std::mem_fun`是C++98标准引入的函数对象,可以在早期版本的C++编译器中使用。因此,如果你的编译器版本过低,可以尝试使用`std::mem_fun`替代`std::mem_fn`来解决问题。
使用`std::mem_fun`的示例代码如下:
```
std::for_each(template_threads.begin(), template_threads.end(), std::mem_fun(&std::thread::join));
```
这样做应该可以解决你遇到的问题。
void MainWindow::moveAgvs(int i),void AGVScheduler::assign_task_to_agv(std::vector<Task>& tasks, std::vector<AGV>& agvs),以下代碼報錯:void MainWindow::action_agv() { std::vector<std::thread> threads; threads.push_back(std::thread(&AGVScheduler::assign_task_to_agv, std::ref(tasks), std::ref(agvs))); // 分配小车 for (int i = 0; i < agvs.size(); i++) { threads.push_back(std::thread(&moveAgvs, i));// 更新 AGV } for (auto& t : threads) { t.join(); } }
这段代码报错的原因是在调用"std::thread"的构造函数时,传递给"AGVScheduler::assign_task_to_agv"函数的参数列表中多了一个右括号")"。您可以将代码修改为以下形式:
```c++
void MainWindow::action_agv() {
std::vector<std::thread> threads;
threads.push_back(std::thread(&AGVScheduler::assign_task_to_agv, std::ref(tasks), std::ref(agvs))); // 分配小车
for (int i = 0; i < agvs.size(); i++) {
threads.push_back(std::thread(&moveAgvs, i)); // 更新 AGV
}
for (auto& t : threads) {
t.join();
}
}
```
将多余的右括号")"删除即可。另外,您需要确保"tasks"和"agvs"向量在调用"action_agv"函数时已经被正确初始化,以避免其他潜在的运行时错误。