Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.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_Semaphore - Fatal编程技术网

C 从伪代码定义信号量

C 从伪代码定义信号量,c,semaphore,C,Semaphore,以下是我上一个问题的答案: 现在我想学习如何从这个伪代码中定义信号量,包括结构和操作。 我只找到了太复杂的信号量定义示例,所以我根本不了解它们 上一篇文章中的伪代码: Th1 { display "Hello 1" } Th2 { display "Hello 2" } Th3 { display "Hello 3" } main() { Fork(Th1);Fork(Th2);Fork(Th3); } 我不确定您是在尝试定义自己的信号量实现,还是希望使用该实现 使用POSIX信号量

以下是我上一个问题的答案:

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

上一篇文章中的伪代码:

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

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

我不确定您是在尝试定义自己的信号量实现,还是希望使用该实现

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

sem_t name_of_your_semaphore;
之后,需要使用sem_init初始化信号量:

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

等待 将由初始_值表示的信号量值减少1。 检查该值是否小于0。 如果该值小于0,则将进程置于睡眠状态,并将其置于信号量队列中。CPU不再尝试调度此进程,与更简单的忙等待方法相比,这会提高性能。 如果该值大于或等于0,则进程不会被阻止并继续执行。 信号 增加信号量的值。 如果信号量的值小于或等于0,则表示某个进程以前在信号量上被称为等待,但仍然被阻塞。在这种情况下,我们正在向这个过程发出信号,通知它现在可以恢复执行。我们取出信号量队列中的第一个进程,让它恢复执行。CPU负责安排它再次运行。 这就是说,如果要确保互斥,只需将初始_值设置为1

要等待信号量,请呼叫:

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

要向信号量ie发送信号,请告诉队列中正在等待的进程它可以恢复执行:

sem_post(&name_of_your_semaphore);
上述过程的结果

希望这有帮助