Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 条件变量线程同步_C_Multithreading_Operating System_Pthreads_Mutex - Fatal编程技术网

C 条件变量线程同步

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

我正在尝试对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 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