领导者/追随者模式,具体来说,设计一种线程池机制,每次只让一个线程(领导者)等待队列不空,其他线程(追随者)排队成为领导者。从队列中取到任务后,当前领导者首先将一个追随者线程提拔为新的领导者线程,再扮演处理线程角色。当前领导者线程等待队列的元素入队时,可能有多个处理线程同时处理任务。处理完任务后,处理线程再次番禺追随者线程的角色,等待再次成为领导者线程。
要将追随者线程提拔为领导者线程以及判断当前哪个线程为领导者线程,有多种实现方式:
1、LIFO顺序:在很多应用中,哪个追随线程提拔为领导者线程都无关紧要。在这种情况下,可以后进先出的方式提拔追随者线程为领导者线程。以这种方式可以最大限度地提高CPU的缓存亲和性。如果最近诸事的线程重新运行时,执行的代码和数据几乎相同,将因缓存亲和性而改善系统性能。然而,要实现LIFO提拔协议,需要一个额外的数据结构(如实现一个等待线程栈,通过信号(或其他方式)唤醒最近入栈的线程,提拔为领导者线程),而不能仅仅使用原生的操作系统同步对象(如信号量)。
2、优先级顺序:在有些应用程序中,线程的优先级可能不一样,在这种情况下,可能必须根据优先级来提拔追随者线程。可以使用优先级队列,在提拔线程时,取出优先级最高的线程id,通过信号(或其他方式)唤醒线程,提拔为领导者线程。
3、实现定义的顺序:使用操作系统同步器(如信号量或条件变量)来提拔追随者线程,这种排序方式最常见,操作系统同步器通常以实现定义的顺序分派等待的线程。这种协议的优点在于,直接对应于原生操作系统同步器。