好的,您的 3 个报价并非不兼容。但是让我们来看看实现:
每个可等待对象都有一个附加的布尔值,称为信号状态,用于等待该对象;如果对象是有信号的,那么等待函数将不会等待它;如果对象是non-signaled,则等待函数将等待它。
现在,这如何应用于特定类型的对象?这取决于对象的性质,特别是与等待它相关的语义。实际上,信号状态是根据等待条件定义的。例如(有关详细信息,请参阅文档):
- 当互斥锁不被拥有时,它会发出信号。
- 进程/线程完成时会发出信号。
- 信号量在其计数大于 0 时发出信号。
- 等待计时器到期时会发出信号。
如果互斥体在拥有时发出信号,您可能会更喜欢,但实际上它是在不拥有时发出的。这对于让等待函数做正确的事情是必要的。
那么事件呢?嗯,它们是一些简单的对象,你可以随意给它们发信号和去信号,所以信号状态没有额外的意义:
- 发出信号:线程不会等待它。
- 非信号:线程将等待它。
事件也有这个SignalPulse
和AutoReset
一些有点奇怪的东西(而且 IME 实际上不可能正确使用)。
现在,让我们看看你的报价:
信号状态表示资源可供进程或线程使用。无信号状态指示资源正在使用中。
其实,这是一种解释。通常有一个资源是你试图仲裁的,并且通常你会等待当且仅当该资源正在使用中,所以它在使用资源和等待资源之间进行等价。但这不是技术要求,只是一个常见的用例。
处于信号状态的对象不会导致等待该对象的线程阻塞,而不处于信号状态的对象将导致等待该对象的任何线程阻塞,直到该对象再次变为信号状态。
正确且切中要害!
一个事件处于有信号状态意味着它有能力释放等待这个事件发出信号的线程。一个事件处于非信号状态意味着它不会释放任何正在等待这个特定事件的线程。
我觉得这个措辞有点令人困惑……但它与前一个相比并没有增加任何内容。