我正在阅读一些考试代码,它是这样的:
sem_t s;
int main(int argc ,char *argv[]) {
thread_t p1, p2, p3;
sem_init(&s,X,X)
thread_create(&p1,child);
thread_create(&p2,child);
thread_create(&p3,child);
sem wait(&s);
}
我应该如何初始化信号量
s
,假设子进程中的每个线程在sem_post()
上都有一个s
,以便父进程在三个子进程之后结束运行?
我想说我应该将其初始化为“
sem_init(&s, 1, -2)
”,以便 3 个 sem_post
将其设置为 1,并且 sem_wait
不会使其进入睡眠状态,但我仍然认为 sem_post
会唤醒一个即使信号量的值小于 0,线程也会向上,因此,如果父进程继续等待,那么第一个执行 sem_post
操作的子进程会唤醒他,并且不会等待所有三个子进程。
我正在阅读操作系统 - 三个简单的部分,并且在并发部分,当谈论信号量时,它并没有说如果信号量的值在增量
sem_post
之后小于0,它不会唤醒启动一个已经在 sem_wait
上的线程,所以我认为它实际上在任何情况下都会唤醒它。
我应该如何初始化信号量
,假设s
中的每个线程在child
上都有一个sem_post()
,以便父级在三个子级之后结束运行?s
无论
s
的行为如何,都无法通过初始化 main()
来保证给定 child()
的此类行为。 main()
函数执行一个 sem_wait()
。您无法将 s
初始化为小于 0 的值。如果将其初始化为大于零的值,则 main()
可能根本不会等待任何子级。如果将其初始化为 0,则只要任何一个子级执行 main()
,sem_post()
就可以继续进行。
如果您希望
main()
等待所有三个子级,其中每个子级只递增信号量一次并且从不递减它,那么 main
必须 sem_wait()
三次。