等待子线程的信号量

问题描述 投票:0回答:1

我正在阅读一些考试代码,它是这样的:

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
上的线程,所以我认为它实际上在任何情况下都会唤醒它。

multithreading pthreads posix semaphore condition-variable
1个回答
0
投票

我应该如何初始化信号量

s
,假设
child
中的每个线程在
sem_post()
上都有一个
s
,以便父级在三个子级之后结束运行?

无论

s
的行为如何,都无法通过初始化
main()
来保证给定
child()
的此类行为。
main()
函数执行一个
sem_wait()
。您无法将
s
初始化为小于 0 的值。如果将其初始化为大于零的值,则
main()
可能根本不会等待任何子级。如果将其初始化为 0,则只要任何一个子级执行
main()
sem_post()
就可以继续进行。

如果您希望

main()
等待所有三个子级,其中每个子级只递增信号量一次并且从不递减它,那么
main
必须
sem_wait()
三次。

© www.soinside.com 2019 - 2024. All rights reserved.