是否保证信号到达线程?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否保证信号到达线程?相关的知识,希望对你有一定的参考价值。

假设我在T1, T2, T3资源上有三个线程,lock,一个锁定cond和一些条件Resource

T1获得锁定,现在由于一些条件而做cond.await()并且T2得到那个锁并且做cond.signal()然后继续做lock.unlock(),但是有一段时间,T3也试图获得锁定所以它在lock.lock()线,究竟是什么发生?

T2重新获得锁定或T3得到它还是基于scheudler随机?

答案

如果您阅读文档,即ReentrantLock的javadoc,它在第3段中专门回答了这个问题:

此类的构造函数接受可选的fairness参数。设置true时,在争用下,锁定有利于授予对等待时间最长的线程的访问权限。否则,此锁定不保证任何特定的访问顺序。

另一答案

每当发出信号时,其中一个等待线程将被移除,并将被放回到入口集中,以便他有机会运行。在signalAll方面,所有等待的线程都将从等待集中删除并放回到入口集中,以便它们有机会运行。

然后,调度程序然后决定从条目集中选择哪个线程。在公平性方面,最长的等待将首先获得机会。

好的解释here

以上是关于是否保证信号到达线程?的主要内容,如果未能解决你的问题,请参考以下文章

MFC中如何让多线程按先后顺序执行,第一个来的先执行,以后按先后到达的顺序执行

用信号量保证 FIFO?

用 kill 发送到父线程的信号是不是保证在下一条语句之前被处理?

Qt5 中存在哪些同步原语可以让我在单个线程中等待信号到达?

线程同步之信号量

BeginRead 是不是保证读取在调用它之后到达的任何传入字节?