为啥我们不能访问信号量
Posted
技术标签:
【中文标题】为啥我们不能访问信号量【英文标题】:Why can't we access semaphore为什么我们不能访问信号量 【发布时间】:2018-01-13 12:53:15 【问题描述】:我正在阅读有关信号量的信息,here 我发现您无法直接访问(递增/递减)信号量。
信号量是一个整型变量,只能通过wait()和signal()两个操作来访问。
关于这个话题我有两个问题:
-
什么是信号量的类型。它是结构还是其他数据类型。
如果是结构,那么我的第二个问题是:
-
为什么我们不能使用
semaphore.some_value++
访问信号量。
如果它是我在wikipedia 上找到的变量:
一个平凡的信号量是一个普通的变量 那为什么我们不能像
semaphore1++
那样访问它呢?
我试图增加它并得到这个错误:
错误:递增的类型参数错误
为什么禁止用户访问,为什么我们必须使用函数来访问它? (虽然我同意,使用函数并不是一个坏习惯,但是为什么?)
【问题讨论】:
【参考方案1】:信号量的功能不仅在于整数的递增和递减,还在于信号量用户之间的通信。通信方面是由wait
和signal
函数封装的。特别是,在大多数操作系统上,它们将使用较低级别的内核功能,这样wait
就不需要浪费 CPU 反复检查信号量的值了。
您收到该编译器错误的事实表明,在您的系统上,信号量是一种结构。但是,您将无法通过直接访问结构成员来使用信号量,因为这不会影响底层内核对象。
【讨论】:
所以,基本上semaphore.h
文件中的wait()
定义下还有一些代码,这有助于同步而不仅仅是信号量的值,用户不应该为这些而烦恼操作?
如果我强行改变它的值,可能会导致一些错误。
是的,代码不仅在wait()
定义下,而且在决定允许哪个线程运行的内核调度器中。以上是关于为啥我们不能访问信号量的主要内容,如果未能解决你的问题,请参考以下文章
spring security:为啥我们不能在@PreAuthorize 中访问 Hibernate 实体参数?
为啥我们不能在 Kotlin 的 Singleton 类(对象)中使用受保护的访问修饰符