如何选择“领导者和追随者”?

时间:2018-03-22 09:49:49

标签: c sockets

我正在使用Select编写网络,而我正在为“选择”做“领导者/关注者”。

我的理念是:

N个线程正在执行io事件,只有一个(领导者)被select阻止,其他人可能等待成为领导者,当选择返回时,例如,选择返回10个io事件,然后领导者将执行一个并发送9到其他线程要做。 在所有事件完成之前,其中一个线程将成为领导者再次进行选择,其他人则等待(因为并非所有工作都已完成)。

我认为如果所有io事件都没有完成,但是一个线程成为做选择的领导者,在某些情况下,可能有多个线程可能处理相同的io事件。我对吗 ?或者还有其他方法可以选择“领导者/追随者”吗?

1 个答案:

答案 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?