条件变量线程同步

时间:2017-04-29 19:25:38

标签: c multithreading operating-system pthreads mutex

我正在尝试将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函数中?

1 个答案:

答案 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.