我正在尝试将pthread_cond_wait()
用于FIFO等待队列。
我有停车场和汽车。每批都有一个容量。达到容量后,汽车应排队等候,当新的空间可用时,新车应以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函数中?
答案 0 :(得分:0)
我建议重新构建代码。目前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.