对线程池的理解

对线程池的理解:

    想像一个体检场景,100位同学(s)在A屋,3位医生(d)在B屋(睡着觉),还有一位组织学生体检的老师(睡着觉)。管理员看了下B屋里的情况,叫醒老师说:3位医生空闲,可以叫人进去。老师看了一下是d1、d2、d3空闲着,于是老师叫s1准备,看到s1准备好过后请管理员叫醒了d1,d1开始为s1体检;老师接着叫s2准备,看到s2准备好过后请管理员叫醒了d2,d2开始为s2体检;老师再叫s3准备,看到s3准备好过后请管理员叫醒了d3,d3开始为s3体检。安排完3位同学过后老师看暂时没啥事了就开始睡觉,叫管理员帮忙看着说有医生空闲的话就把他叫醒。过了一会儿d2先检查完了,d2对管理员说:我检查完了,帮我通知一下老师现在可以进来1个学生,我先睡觉了,老师叫我的话你就把我叫醒。管理员就叫醒老师说,可以进去1位学生。老师看了看,发现是d2检查完了,于是通知下一位同学s4准备去找d2,看到s4同学准备好过后就请管理员叫一下d2,把d2叫醒后,d2便开始为s4体检,老师又开始睡觉叫管理员帮忙看着说有医生空闲的话就把他叫醒。

    这个例子中3位医生、1位老师、1位管理员分别代表了5个线程,为100位同学做体检代表了多线程的任务。这里的管理员指的是系统维护的线程(个人理解),在涉及到延时、等待,比如等待互斥锁或者sleep时由系统统一维护,这样等待就应该不会耗费额外的cpu资源。老师对应了程序主线程,负责任务的分发,但是主线程没有必要一直运行,因为线程池不一定有空闲的线程,那么主线程就需要等待是否有空闲线程,而如果用while(isbusy)等方式去判断要耗费cpu,所以好的做法是把等待的工作交给互斥量或者条件变量,互斥量是由系统线程去等待的,不需要耗费额外cpu,也就是管理员所做的工作。3位医生对应线程数为3的线程池,线程池中的线程也会涉及到等待任务分发,也应该把等待的工作交给互斥量。

    这个例子只是比较简单的场景,假设大家只有一张共同的体检结果表单,一旦体检完一人马上填写,那么假设几位医生同时体检完怎么办呢?这里又涉及到等待的问题。未完待续...

你可能感兴趣的:(C\C++)