if (agvs[i].battery_ <100){ std::thread charge_thread([&]() { agv_charge(i); moveAgvs(i); }); charge_thread.detach(); }
时间: 2024-02-10 12:06:59 浏览: 65
在这段代码中,如果你想在新线程结束时运行 `move(i)`,可以将代码修改为:
```
if (agvs[i].battery_ < 100) {
auto i_copy = std::move(agvs[i]);
std::thread charge_thread([i_copy]() {
agv_charge(i_copy);
moveAgvs(i_copy);
// 在线程结束时运行move(i)
move(std::move(i_copy));
});
charge_thread.detach();
}
```
这里先将 `agvs[i]` 移动到一个新的变量 `i_copy` 中,然后在新线程中使用 `i_copy`,确保在线程中可以访问到它。在线程结束时,先运行 `move(i_copy)`,将它移动到别处,然后再运行 `move(std::move(i_copy))`,将 `i_copy` 移动到别处。
相关问题
if (agvs[i].battery_ < 100) { auto i_copy = std::move(agvs[i]); std::thread charge_thread([i_copy]() { agv_charge(i_copy); // 在线程结束时运行moveAgvs(i) moveAgvs(i_copy); }); charge_thread.detach(); },報錯: agv_charge需要編譯器取this
如果 `agv_charge` 函数是在类中定义的,那么它需要访问类的成员变量或者调用类的成员函数时,就需要编译器传递 `this` 指针。因此,在 lambda 表达式中调用 `agv_charge` 函数时,也需要传递 `this` 指针。
例如,如果 `agv_charge` 函数定义在名为 `AGV` 的类中,可以将代码修改为:
```
if (agvs[i].battery_ < 100) {
auto i_copy = std::move(agvs[i]);
std::thread charge_thread([this, i_copy]() {
agv_charge(i_copy);
// 在线程结束时运行moveAgvs(i)
moveAgvs(i_copy);
});
charge_thread.detach();
}
```
这里使用了 `[this, i_copy]` 捕获列表,将 `this` 指针和 `i_copy` 变量都传递给了 lambda 表达式。这样,在 lambda 表达式中就可以正常地调用 `agv_charge` 函数了。
if (agvs[i].battery_ < 100) { auto i_copy = std::move(agvs[i]); std::thread charge_thread([this, i_copy, i]() { // 传递 i 参数 agv_charge(i_copy); // 在线程结束时运行moveAgvs(i) moveAgvs(i); }); charge_thread.detach(); }
这段代码可以在 `agvs[i].battery_ < 100` 时,将 `agvs[i]` 移动到 `i_copy` 中,并在新线程中调用 `agv_charge(i_copy)` 和 `moveAgvs(i)`。其中,`this` 指针用于访问类的成员变量和成员函数。
需要注意的是,这里传递的 `i` 参数是原始的索引值,而不是移动后的 `i_copy`。如果需要在新线程中访问移动后的 `i_copy`,需要将它作为一个参数传递给新线程。例如:
```
if (agvs[i].battery_ < 100) {
auto i_copy = std::move(agvs[i]);
std::thread charge_thread([this, i_copy, i]() {
agv_charge(i_copy);
// 在线程结束时运行moveAgvs(i_copy)
moveAgvs(i_copy);
}, i_copy); // 将 i_copy 作为参数传递给新线程
charge_thread.detach();
}
```
这里将 `i_copy` 作为新线程的一个参数传递,同时在 lambda 表达式中也使用了 `i_copy`,保证了在新线程中可以访问到正确的变量。
阅读全文