我正在使用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/

10-15 02:11