我真的很困惑为什么这不起作用,因为大多数关于信号量的示例都是多线程的,而不是多处理的,我有点困惑。我的代码不能工作,除非我把它放在sem_wait上面。
while (1)
{
int x;
sem_getvalue(sem1, &x);
if (x>0) break;
sleep(1);
}
本质上是自己做信号量...这就像sem_wait只检查一次值,然后永远保持不变。我有两个生产者和一个消费者。以下是它的结构:
Producer 1:
sem_waits for sem1 (initially set to 1)
sem_posts to sem2
Producer 2:
sem_waits for sem2 (initially set to 0)
sem_posts to sem1
没有这个代码段,生产者2永远不会运行。在生产者2但不是1中使用该代码段,生产者1运行,然后运行2,然后停止。两人都需要这个片段来做他们的其他事情..
我觉得我的问题就在这里:
// sem open must be used to be used by multiple processes?
sem_t *sem1 = sem_open("producer", O_CREAT, 0644, 1);
sem_t *sem2 = sem_open("producer2", O_CREAT, 0644, 0);
sem_t *consumer_full = sem_open("cfull", O_CREAT, 0644, 0);
sem_t *consumer_empty = sem_open("cempty", O_CREAT, 0644, 0);
// sem_open remains in memory even after program exit.
// initialize to correct value to be sure
sem_init(sem1,0,1);
sem_init(sem2,0,0);
sem_init(consumer_full,0,0);
sem_init(consumer_empty,0,0);
sem_init更改信号量,以便它们只能通过存储在共享内存中来共享?但是如何初始化一个sem_open信号量而不设计任意的do while循环呢?
sem_init
用于创建匿名信号量。对通过sem_open
打开的命名信号量调用它会调用未定义的行为。这可能是你问题的根源。您正在用新的匿名非进程共享信号量破坏您打开的命名进程共享信号量,即使它没有调用未定义的行为,这在语义上也是错误的。
问题内容: 信号量可以小于0吗?我的意思是说我有一个N = 3的信号量,并且我叫“ down” 4次,那么N将保持为0,但是一个进程将被阻塞吗? 同样,如果一开始我打电话给我,N是否可以高于3?因为如我所见,如果N可以大于3,如果一开始我调用了两次,那么以后我可以调用的次数比我可以调用的次数多,因此在关键部分放置了更多的进程,则信号量使我可以。 如果有人为我澄清一下,我将不胜感激。 格雷格 问题答
首先想到的问题是,为什么我们需要信号量? 一个简单的答案,以保护多个进程共享的关键/共同区域。 假设多个进程正在使用相同的代码区域,如果所有人都想并行访问,那么结果是重叠的。 例如,多个用户仅使用一台打印机(通用/关键部分),例如个用户,同时给予个作业,如果所有作业并行启动,则一个用户输出与另一个用户输出重叠。 因此,我们需要使用信号量来保护这个信号,即当一个进程正在运行时锁定关键部分,并在完成时
信号量 信号量是一种同步互斥机制的实现,普遍存在于现在的各种操作系统内核里。相对于spinlock 的应用对象,信号量的应用对象是在临界区中运行的时间较长的进程。等待信号量的进程需要睡眠来减少占用 CPU 的开销。参考教科书“Operating Systems Internals and Design Principles”第五章“同步互斥”中对信号量实现的原理性描述: struct semaph
一个线程发送信号量,另外一个线程接收信号量 一个线程发送信号量,另外一个线程接收信号量 源码/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2018-08-24 yangjie
信号量接口 结构体 struct rt_semaphore 信号量控制块 更多... 类型定义 typedef struct rt_semaphore * rt_sem_t 信号量类型指针定义 函数 rt_err_t rt_sem_init (rt_sem_t sem, const char *name, rt_uint32_t value, rt_uint8_t flag
信号量 这是本章的第三部分 chapter,本章描述了内核中的同步原语,在之前的部分我们见到了特殊的 自旋锁 - 排队自旋锁。 在更前的 部分 是和 自旋锁 相关的描述。我们将描述更多同步原语。 在 自旋锁 之后的下一个我们将要讲到的 内核同步原语是 信号量。我们会从理论角度开始学习什么是 信号量, 然后我们会像前几章一样讲到Linux内核是如何实现信号量的。 好吧,现在我们开始。 介绍Linux