gpt4 book ai didi

c - 从伪代码定义信号量

转载 作者:行者123 更新时间:2023-11-30 14:59:04 25 4
gpt4 key购买 nike

这是我上一个问题的后续:Fork(); method in C: determine order

我现在想学习如何从这个伪代码定义信号量,包括结构和操作。我只找到过于复杂的信号量定义示例,所以我根本不明白它们。

上一篇文章的伪代码:

Th1 { display "Hello 1" }
Th2 { display "Hello 2" }
Th3 { display "Hello 3" }

main() {
Fork(Th1);Fork(Th2);Fork(Th3);
}

最佳答案

我不确定您是否正在尝试定义自己的信号量实现,或者您想使用 POSIX执行。

使用 POSIX 信号量,您应该首先声明一个全局信号量以供不同线程使用(在您的情况下,它们似乎是不同的进程),如下所示:

sem_t name_of_your_semaphore;

之后,您需要使用 sem_init 初始化信号量:

sem_init(&name_of_your_semaphore, pshared, initial_value);

其中pshared和initial_value都是int。从sem_init man page可以看出如果 pshared 为 0,则信号量可以在单个进程内的线程之间共享。如果pshared不为0,则可以跨多个进程共享。由于您在程序中使用 fork 系统调用,因此您实际上正在创建不同的进程,因此您应该使用非零 pshared 值。initial_value 是信号量的初始值。如果将其初始化为 1,则称其为二元信号量,并且可用于提供互斥。如果将其初始化为大于 1 的值,则它是一个计数信号量,可用于解决诸如消费者-生产者问题之类的问题,在该问题中,您希望跨该资源的不同消费者管理该资源的多个实例。要了解初始值如何影响同步,您必须了解当您在信号量上等待或发出信号时会发生什么。

等待

  1. 将信号量的值(由initial_value 表示)减1。
  2. 检查该值是否小于 0。
  3. 如果该值小于0,则让进程进入休眠状态并将其放入信号量队列中。 CPU 不再尝试调度此进程,与更简单的繁忙等待方法相比,这会提高性能。
  4. 如果该值大于或等于 0,则进程不会被阻止并继续执行。

信号

  1. 增加信号量的值。
  2. 如果信号量的值小于或等于0,则表示某个进程先前在该信号量上调用了等待,并且仍然阻塞在该信号量上。在这种情况下,我们向该进程发出信号,通知它现在可以恢复执行。我们取出信号量队列中的第一个进程,使其恢复执行。 CPU负责调度它再次运行。

也就是说,如果你想确保互斥,你只需将initial_value设置为1即可。

要等待您的信号量,请调用:

sem_wait(&name_of_your_semaphore);

这将导致上述过程中,值被递减。如果它为零,则该进程是第一个调用 wait 的进程,因此它不必等待(它将是第一个尝试访问您要保护的资源的进程)。如果该值小于0,则进程将进入休眠状态并放入信号量队列中。

向信号量发出信号(即告诉在队列中等待的进程可以恢复执行):

sem_post(&name_of_your_semaphore);

上述过程的结果。

希望这有帮助。

关于c - 从伪代码定义信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43030812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com