是否保证信号到达线程?
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中如何让多线程按先后顺序执行,第一个来的先执行,以后按先后到达的顺序执行
用 kill 发送到父线程的信号是不是保证在下一条语句之前被处理?