if (agvs[i].battery_ <100){ std::thread charge_thread(& { agv_charge(i); }); charge_thread.detach(); },不使用join函数,黨新綫程結束的時候,去觸發moveAgvs(i)
时间: 2024-02-27 20:56:53 浏览: 78
AGVS.rar_AGVS调度_gulf5j4_scheduling AGV_wpf agv调度系统_调度控制
5星 · 资源好评率100%
如果您不使用`std::thread::join`函数等待线程结束,可以使用条件变量来等待线程结束,并在结束后触发`moveAgvs(i)`函数的执行,如下所示:
```c++
#include <mutex>
#include <condition_variable>
std::mutex mtx;
std::condition_variable cv;
void agv_charge(int i)
{
// 充电函数
// ...
// 充电结束后,通知等待的线程
cv.notify_one();
}
void moveAgvs(int i)
{
// 移动AGV函数
// ...
}
if (agvs[i].battery_ < 100){
// 创建新线程并运行 agv_charge(i) 函数
std::thread charge_thread([&]() {
agv_charge(i);
});
// 等待新线程结束
std::unique_lock<std::mutex> lk(mtx);
cv.wait(lk);
// 在新线程结束后运行 moveAgvs(i) 函数
moveAgvs(i);
// 释放锁
lk.unlock();
// 分离线程
charge_thread.detach();
}
```
在这个例子中,使用条件变量`cv`来等待线程结束。首先,创建新线程并运行`agv_charge(i)`函数。在`agv_charge`函数中,当充电结束后,会调用`cv.notify_one()`通知等待的线程。
在主线程中,使用`std::unique_lock`定义一个锁`lk`,然后调用`cv.wait(lk)`等待线程结束。这样,在等待线程结束时,锁会被释放,其他线程可以访问共享资源。当线程结束后,调用`moveAgvs(i)`函数执行其他操作,并释放锁,然后使用`detach`将线程分离。
需要注意的是,在使用条件变量等待线程结束时,需要使用`std::unique_lock`定义一个锁,并在等待线程结束前调用`lk.unlock()`释放锁。否则,其他线程可能无法访问共享资源,导致死锁。
阅读全文