首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何做好“领导者和追随者”的选拔?

如何做好“领导者和追随者”的选拔?
EN

Stack Overflow用户
提问于 2018-03-22 09:49:49
回答 1查看 66关注 0票数 0

我正在使用select编写网络,我正在为Select编写“领导者/追随者”。

我的概念是:

N个线程正在执行io事件,只有一个(领导)被select阻塞,其他线程可能等待成为领导者,当选择返回时,例如选择返回10个io事件,那么领导者将执行一个任务,并将9个线程分派给其他线程执行。直到所有事件都完成了,其中一个线程将成为再次进行选择的领导者,而其他线程则在等待(因为不是所有的工作都完成了)。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-22 11:02:10

有了评论中所解释的,这里有一些应该起作用的东西:

首先,所有线程都以“跟随者”开头。其次,保留i/o的“列表”也应该保留一个状态(如"waiting_treatement“、"treatement_in_progress")。

代码语言:javascript
复制
/* "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,但指向垃圾值)。

如果你知道我能改进这个,谢谢你注意到我。“这对你有好处吗?”新刘说。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49425388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档