我正在使用Select编写网络,并且正在为select做“ leader / follower”。
我的概念是:
N个线程正在执行io事件,只有一个(领导者)被select阻止,其他线程可能等待成为领导者,例如select返回时,例如select返回10个io事件,那么Leader将执行一个并将9个线程分派给其他线程做。在所有事件完成之前,其中一个线程将成为领导者再次进行选择,而其他线程则处于等待状态(因为并非所有工作都已完成)。
我认为,如果未完成所有io事件,但是一个线程成为领导者来进行选择,在某些情况下,可能有多个线程可以处理同一io事件。我对吗 ?还是有其他方法可以做“领导者/追随者”的选择?
最佳答案
根据评论中的解释,此处应采取以下措施:
首先,所有线程都以“跟随者”开头。
其次,保留I / O的“列表”也应保留一个状态(如“ waiting_treatement”,“ treatement_in_progress”)。
/* "global" variable */
int nbThread = ?;
int waitingThread = 0;
// "i/o" ==> the thread have take an i/o from i/o_list
begin loop
lock mutex : i/o_list
if i/o
remove i/o from i/o_list
endif
if i/o_list is not empty (one i/o have state "waiting_treatement")
take i/o ("waiting_treatement" -->> "treatement_in_progress")
else
if waitingThread >= nbThread -1
// take role "leader"
sleep(1); // little workaround in order to reduce race-condition probability
select // get new i/o
add new i/o in i/o_list
wake up pthread_cond new_i/o
else
// take role "follower"
++waitingThread;
endif
endif
unlock mutex : i/o_list
if i/o
do i/o
else
wait pthread_cond new_i/o
--waitingThread;
endif
endloop
一般而言,我对pthread_condition和“复杂的”多线程并不太放心,但是从潜在的竞争条件来看,我认为这种算法没有任何问题。当然,您的线程必须处于正确的状态(没有指向I / O作业的指针,而不是指向NULL,而是指向垃圾值)。
如果您知道我可以如何改善这一点,谢谢您注意我。
@NeoLiu,这对您有好处吗?
关于c - 如何做“领导者和跟随者”的选择?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49425388/