C 条件变量线程同步
我正在尝试对FIFO等待队列使用C 条件变量线程同步,c,multithreading,operating-system,pthreads,mutex,C,Multithreading,Operating System,Pthreads,Mutex,我正在尝试对FIFO等待队列使用pthread\u cond\u wait()。 我有停车场和汽车。每个批次都有容量。达到容量后,车辆应排队等候,当新空间可用时,新车辆应以先进先出的方式停在该停车场。 我想要达到的是 //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 thr
pthread\u cond\u wait()
。
我有停车场和汽车。每个批次都有容量。达到容量后,车辆应排队等候,当新空间可用时,新车辆应以先进先出的方式停在该停车场。
我想要达到的是
//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\u death
事件,在初始化线程时必须使用trigger\u lot\u事件设置该事件。触发trigger\u death
会杀死线程2。我建议重新构造代码。目前,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\u death
事件,在初始化线程时必须使用trigger\u lot\u事件设置该事件。触发trigger\u death
应终止线程2