【问题标题】:Conditional variable thread sync条件变量线程同步
【发布时间】:2017-09-27 17:15:51
【问题描述】:

我正在尝试将pthread_cond_wait() 用于 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 函数中?

【问题讨论】:

    标签: c multithreading operating-system pthreads mutex


    【解决方案1】:

    我建议重构您的代码。目前线程 1 和线程 2 都可以停放汽车,但实际上最好将停放的汽车放到线程 2 中,并始终将车辆排队等候。

    您的初始线程上应该有两种方法:

    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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-11
      • 2014-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      • 1970-01-01
      相关资源
      最近更新 更多