我正在使用select编写网络,我正在为Select编写“领导者/追随者”。
我的概念是:
N个线程正在执行io事件,只有一个(领导)被select阻塞,其他线程可能等待成为领导者,当选择返回时,例如选择返回10个io事件,那么领导者将执行一个任务,并将9个线程分派给其他线程执行。直到所有事件都完成了,其中一个线程将成为再次进行选择的领导者,而其他线程则在等待(因为不是所有的工作都完成了)。
我认为如果所有io事件都没有完成,但是有一个线程成为选择的领导者,在某些情况下,可能不止一个线程可以处理相同的io事件。我说得对吗?还是有其他的方式来做“领导者/跟随者”的选择?
发布于 2018-03-22 11:02:10
有了评论中所解释的,这里有一些应该起作用的东西:
首先,所有线程都以“跟随者”开头。其次,保留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和“复杂的”mutli线程并不感到自在,但从潜在的小种族条件来看,我不认为这种情况会有任何问题。当然,您的线程必须处于正确的状态(没有指向i/o作业的指针,不指向NULL,但指向垃圾值)。
如果你知道我能改进这个,谢谢你注意到我。“这对你有好处吗?”新刘说。
https://stackoverflow.com/questions/49425388
复制相似问题