我正在使用Select编写网络,而我正在为“选择”做“领导者/关注者”。
我的理念是:
N个线程正在执行io事件,只有一个(领导者)被select阻止,其他人可能等待成为领导者,当选择返回时,例如,选择返回10个io事件,然后领导者将执行一个并发送9到其他线程要做。 在所有事件完成之前,其中一个线程将成为领导者再次进行选择,其他人则等待(因为并非所有工作都已完成)。
我认为如果所有io事件都没有完成,但是一个线程成为做选择的领导者,在某些情况下,可能有多个线程可能处理相同的io事件。我对吗 ?或者还有其他方法可以选择“领导者/追随者”吗?
答案 0 :(得分:1)
根据评论中的解释,这里应该有一些技巧:
首先,所有主题都以“追随者”开头。 其次,保留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?