std::vector<std::thread> threads; task_to_agv(); for (int i = 0; i < agvs.size(); i++) { threads.push_back(std::thread(&moveAgvs, i)); // 更新 AGV } for (auto& t : threads) { t.join(); }
时间: 2024-04-27 16:21:01 浏览: 121
这段代码也是使用 C++11 中的多线程库 `std::thread` 进行并行编程。第一行代码定义了一个 `std::vector<std::thread>` 类型的变量 `threads`,用于存储线程。接下来的 `task_to_agv()` 函数是用于将任务分配给 AGV 的,它没有被分配到新的线程中,这意味着它将在主线程中运行。然后,使用 `for` 循环创建了 `agvs.size()` 个新的线程,执行函数是 `moveAgvs`,参数是 `i`。最后一个 `for` 循环等待所有线程运行完毕,调用 `join()` 函数阻塞当前线程,直到线程结束。和之前的代码相比,这段代码的区别在于将 `task_to_agv()` 函数放在了主线程中运行,而不是在新的线程中分配任务。
相关问题
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(& MainWindow::moveAgvs, i)); // 更新 AGV } for (auto& t : threads) { t.join(); ,報錯:no matching function for call to “std:: thread :: _ lnvoker<std::tuple<std::tuple<void
这个错误通常是由于参数类型不匹配导致的。在这段代码中,错误可能是由于 `MainWindow::moveAgvs` 函数的参数类型与 `std::thread` 构造函数所需的参数类型不匹配。
请检查 `MainWindow::moveAgvs` 函数的定义和声明,确保其参数类型与所需的参数类型一致。如果参数类型正确,请检查代码中是否存在其他语法错误或类型不匹配的情况。
void assign_task_to_agv(std::vector<Task>& tasks, std::vector<AGV>& agvs);,void MainWindow::moveAgvs(int i),void MainWindow::action_agv() { std::vectorstd::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(& MainWindow::moveAgvs, i)); // 更新 AGV } for (auto& t : threads) { t.join(); ,報錯:no matching function for call to “std:: thread :: _ lnvoker<std::tuple<std::tuple<void(AGVScheduler::*)(std::vector<Task>)...怎麽修改
这个错误通常是由于函数指针类型不匹配导致的。在这段代码中,错误可能是由于 `AGVScheduler::assign_task_to_agv` 函数的类型与 `std::thread` 构造函数所需的类型不匹配。
请检查 `AGVScheduler::assign_task_to_agv` 函数的类型,确保其与 `std::thread` 构造函数所需的类型一致。由于 `AGVScheduler::assign_task_to_agv` 是一个成员函数,因此需要使用类的指针或引用来调用该函数。正确的写法应该是:
```
threads.push_back(std::thread(&AGVScheduler::assign_task_to_agv, &agvScheduler, std::ref(tasks), std::ref(agvs)));
```
这样就可以将 `agvScheduler` 对象、`tasks` 和 `agvs` 作为参数传递给 `AGVScheduler::assign_task_to_agv` 函数,并在新的线程中运行该函数。注意,这里使用了 `&agvScheduler` 来传递 `AGVScheduler` 对象的指针,同时使用了 `std::ref` 来将 `tasks` 和 `agvs` 引用传递给线程,避免了拷贝。
阅读全文