条件变量线程同步
Conditional variable thread sync
我正在尝试将 pthread_cond_wait()
用于 FIFO 等待队列。
我有停车场和汽车。每个批次都有一个容量。达到容量后,汽车应排队等候,当新 space 可用时,新车应以 FIFO 方式停在该停车场。
我想要达到的是
//thread1
if(Park capacity is not reached)
coming car parks to lot
else
coming car is added to the queue
if(a car leaves the lot )
signal thread 2
//thread2
while(no signal from thread1)
pthread_cond_wait()
oldcar = dequeue
oldcar parks to lot
基本上,我的问题是什么时候向线程 2 发送信号。如果我在达到容量时发送信号,它不会很好,因为我们不能让停车场不先出队。
我还有一个问题,这些功能在名为 Park 的函数中是必需的。但是我在调用这个函数之前创建了我的线程。我应该在哪里创建这些线程?在 Park 函数中还是在我创建所有线程的 main 函数中?
我建议重构您的代码。目前thread1和thread2都可以停车,不过真的最好把车放到thread2上,一直排队等车。
你的初始线程应该有两个方法:
void carWantsToPark(Car* car) {
enqueueCar(car);
signal thread2
}
void carWantsToLeave(Car* car) {
removeCarFromLot(car); // removes car from lot
signal thread2;
}
线程 2:
void execThread() {
bool threadAlive=true;
event event_array[2];
event_array[0]=trigger_lot_event;
event_array[1]=trigger_death;
do {
triggerIndex=await_multiple_events(event_array);
if (triggerIndex==1) {
threadAlive=false;
continue;
}
if (len(parking_queue)>0) {
Car* car=dequeueCar();
addCarToLot(car);
}
}
while(threadAlive);
}
// Other methods shared between threads. Ensure to synchronise access to collections
void enqueueCar(Car* car) {
// Add car to queue
}
Car* dequeueCar() {
// Dequeue car and return
return dequeuedCar;
}
void addCarToLot(Car* car) {
}
void removeCarFromLot(Car* car) {
}
我会尽可能在需要时启动线程 - 如果您的程序有可能不需要线程,最好根本不启动它们。另请注意,我在此伪代码中包含了一个 trigger_death
事件,当您初始化线程时,必须使用 trigger_lot_event
设置该事件。触发 trigger_death
应该终止线程 2。
我正在尝试将 pthread_cond_wait()
用于 FIFO 等待队列。
我有停车场和汽车。每个批次都有一个容量。达到容量后,汽车应排队等候,当新 space 可用时,新车应以 FIFO 方式停在该停车场。
我想要达到的是
//thread1
if(Park capacity is not reached)
coming car parks to lot
else
coming car is added to the queue
if(a car leaves the lot )
signal thread 2
//thread2
while(no signal from thread1)
pthread_cond_wait()
oldcar = dequeue
oldcar parks to lot
基本上,我的问题是什么时候向线程 2 发送信号。如果我在达到容量时发送信号,它不会很好,因为我们不能让停车场不先出队。
我还有一个问题,这些功能在名为 Park 的函数中是必需的。但是我在调用这个函数之前创建了我的线程。我应该在哪里创建这些线程?在 Park 函数中还是在我创建所有线程的 main 函数中?
我建议重构您的代码。目前thread1和thread2都可以停车,不过真的最好把车放到thread2上,一直排队等车。
你的初始线程应该有两个方法:
void carWantsToPark(Car* car) {
enqueueCar(car);
signal thread2
}
void carWantsToLeave(Car* car) {
removeCarFromLot(car); // removes car from lot
signal thread2;
}
线程 2:
void execThread() {
bool threadAlive=true;
event event_array[2];
event_array[0]=trigger_lot_event;
event_array[1]=trigger_death;
do {
triggerIndex=await_multiple_events(event_array);
if (triggerIndex==1) {
threadAlive=false;
continue;
}
if (len(parking_queue)>0) {
Car* car=dequeueCar();
addCarToLot(car);
}
}
while(threadAlive);
}
// Other methods shared between threads. Ensure to synchronise access to collections
void enqueueCar(Car* car) {
// Add car to queue
}
Car* dequeueCar() {
// Dequeue car and return
return dequeuedCar;
}
void addCarToLot(Car* car) {
}
void removeCarFromLot(Car* car) {
}
我会尽可能在需要时启动线程 - 如果您的程序有可能不需要线程,最好根本不启动它们。另请注意,我在此伪代码中包含了一个 trigger_death
事件,当您初始化线程时,必须使用 trigger_lot_event
设置该事件。触发 trigger_death
应该终止线程 2。