比如有两对生产者消费者,A生产与B消费,C生产与D消费,总共4个线程。每一对关系就需要2个信号量,一个标识空位empty_sem, 一个标识满位full_sem,所以总共有4个信号量,然后刚好每一对只有一个空位,所以信号值最大只为1,可以看作二值信号量,在初始化的时候把两个empty_sem值初始化为1,两个full_sem值初始化为0,如此工作。
那么问题来了,我可否只用一个事件集(一个事件集可以表示32个事件呢)里面的4个事件来分别表示前面所需要的4个信号量?等于4个线程对4个信号量的take/release操作都变成了对同一个事件集的4个事件进行recv/send操作,初始化的时候先对两个full位进行send操作使之置位相当于把empty_sem值初始化为1。
不知这样的改变是否安全?有没有什么隐患?还是可以放心替换?
你可能还没有完全理解我的意思,我举例的情况中生产者和消费者之间只有一个空位,不会遇到信号量值超过1的情况,所以不存在生产者生产了多个的问题,而且我已经设置了两个信号量empty_sem和full_sem来限制了信号量上限。这个情况理论上来说更适合用二值信号量,但rtt没有提供,所以我在想用事件集来替代二值信号量不知道有没有隐藏问题
不过还是感谢大佬的回复👍
@bigLITTLE 如果你能确保是二值,那就可以