条件变量线程同步

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。