为啥我们不能访问信号量

Posted

技术标签:

【中文标题】为啥我们不能访问信号量【英文标题】:Why can't we access semaphore为什么我们不能访问信号量 【发布时间】:2018-01-13 12:53:15 【问题描述】:

我正在阅读有关信号量的信息,here 我发现您无法直接访问(递增/递减)信号量

信号量是一个整型变量,只能通过wait()和signal()两个操作来访问。

关于这个话题我有两个问题:

    什么是信号量的类型。它是结构还是其他数据类型。

如果是结构,那么我的第二个问题是:

    为什么我们不能使用semaphore.some_value++ 访问信号量。

如果它是我在wikipedia 上找到的变量:

一个平凡的信号量是一个普通的变量 那为什么我们不能像semaphore1++ 那样访问它呢?

我试图增加它并得到这个错误:

错误:递增的类型参数错误

为什么禁止用户访问,为什么我们必须使用函数来访问它? (虽然我同意,使用函数并不是一个坏习惯,但是为什么?)

【问题讨论】:

【参考方案1】:

信号量的功能不仅在于整数的递增和递减,还在于信号量用户之间的通信。通信方面是由waitsignal 函数封装的。特别是,在大多数操作系统上,它们将使用较低级别的内核功能,这样wait 就不需要浪费 CPU 反复检查信号量的值了。

您收到该编译器错误的事实表明,在您的系统上,信号量是一种结构。但是,您将无法通过直接访问结构成员来使用信号量,因为这不会影响底层内核对象。

【讨论】:

所以,基本上semaphore.h文件中的wait()定义下还有一些代码,这有助于同步而不仅仅是信号量的值,用户不应该为这些而烦恼操作? 如果我强行改变它的值,可能会导致一些错误。 是的,代码不仅在wait()定义下,而且在决定允许哪个线程运行的内核调度器中。

以上是关于为啥我们不能访问信号量的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们不能在 C# 中覆盖方法时更改访问修饰符?

spring security:为啥我们不能在@PreAuthorize 中访问 Hibernate 实体参数?

为啥我们不能在 Kotlin 的 Singleton 类(对象)中使用受保护的访问修饰符

为啥我们不能在实现两个接口由相同方法组成的类的方法中使用访问修饰符?

一个网站用域名可以访问,用ip不能访问,是为啥?

为啥类或接口不能接收私有或受保护的访问修饰符?