如果我们在二进制信号量中没有使用 semTake 的情况下多次调用 semGive 会怎么样?会有什么行为?

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

我们使用

semBcreate
创建了一个二进制信号量。

代码片段:

semTake(with 10s wait); // it will be called only once during restart
semGive();              //this will be called from multiple thread. 

所以这里我们会调用很多

semGive()
而没有任何
semTake()
。因为它只在设备重新启动期间调用一次以实现同步。

请帮我回答这个问题,我们没有看到任何问题,但是如果设备长时间运行并且二进制信号量中会调用很多

semGive
怎么办?

我们多次尝试致电

semGive
,但没有注意到任何潜在的问题。但我们需要了解这样做是否有任何缺点。

c++ multithreading operating-system semaphore binary-semaphore
1个回答
0
投票

我们多次尝试致电 semGive,但没有注意到任何潜在问题

这几乎总是一个坏主意。如果文档不能保证信号量(或任何其他东西)始终按照您的程序需要的方式运行,那么您就会为将来的麻烦做好准备。

如果某些库开发人员认为当前的实现存在错误并修复了该错误,会发生什么?该错误修复作为操作系统更新的一部分进行,您的客户接受了更新,然后您的应用程序突然停止为每个人、任何地方、突然停止工作。

去过那里。做到了。这并不好玩。

我从来没有听说过这个

semBCreate
。但@teapot418 发现一个页面可能与您正在使用的相同
semBCreate
。在我看来,好像 maybe 您可以推断出多次调用 semGive(s) 而中间没有
semTake(s,...)
与单次调用
semGive(s)
具有相同的效果。如果这是您的程序所需的行为,那么您可能没问题。
另一方面,文档并没有

明确地

谈论这种情况,*所以也许你应该向库作者发送一封电子邮件以确保确定。

* 您所做的不是二进制信号量的正常用例。

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