C 等等,;信号命令

C 等等,;信号命令,c,pthreads,semaphore,C,Pthreads,Semaphore,如果下面的代码按照我放置它们的顺序执行,我可以确保线程1首先被线程3唤醒,然后被线程2唤醒吗 main: sem_init(&x,0,0); thread 1: sem_wait(&x); thread 2: sem_wait(&x); thread 3: sem_post(&x); 没有理由做出这样的假设。这取决于线程1和线程2何时调用sem_wait(),也就是说,取决于它们之前做了什么,以及调度程序如何为它们提供运行所需的CPU。如果希望在线程2之前

如果下面的代码按照我放置它们的顺序执行,我可以确保线程1首先被线程3唤醒,然后被线程2唤醒吗

main:
sem_init(&x,0,0);

thread 1:
sem_wait(&x);

thread 2:
sem_wait(&x);

thread 3:
sem_post(&x);

没有理由做出这样的假设。这取决于线程1和线程2何时调用sem_wait(),也就是说,取决于它们之前做了什么,以及调度程序如何为它们提供运行所需的CPU。如果希望在线程2之前唤醒线程1,则需要另一个信号量:

main:
sem_init(&x,0,0);
sem_init(&y,0,0);

thread 1:
sem_wait(&x);
sem_post(&y);

thread 2:
sem_wait(&y);

thread 3:
sem_post(&x);

没有理由做出这样的假设。这取决于线程1和线程2何时调用sem_wait(),也就是说,取决于它们之前做了什么,以及调度程序如何为它们提供运行所需的CPU。如果希望在线程2之前唤醒线程1,则需要另一个信号量:

main:
sem_init(&x,0,0);
sem_init(&y,0,0);

thread 1:
sem_wait(&x);
sem_post(&y);

thread 2:
sem_wait(&y);

thread 3:
sem_post(&x);

即使有了这段代码,我们也应该意识到,即使线程1在线程2之前变得可运行,也不一定能保证它会被安排在线程2之前运行。如果在线程2运行之前线程1需要做一些工作,那么
sem\u post(&y)
(或等效的)需要由线程1完成。即使有了这些代码,人们也应该意识到,即使线程1在线程2之前变得可运行,也不一定能保证它会被安排在线程2之前运行。如果在线程2运行之前线程1需要做一些工作,那么
sem\u post(&y)
(或等效)需要由线程1完成。