线程池的思考

本文讨论了线程池的基本概念,涉及的问题包括:仅用互斥体是否可行、任务管理(队列)、接收任务与处理任务分离以及在多任务下使用条件变量的必要性。作者还探讨了自旋锁与互斥体的区别以及`pthread_cond_wait`前的while循环的作用。

有一说一,线程池其实在国内用的不多。就算是C底层的程序员,用线程池也很少。但是这个确实是一个基础操作。所以还是总结一下。

关于线程池,本质就是生产者消费者,其实有几个疑问:

1 只用互斥体可以吗?想了一下可以这样。

mian thread:
    loop:
        mutex_lock
        run_tasks

task thread:
    loop:
        add_task
        mutex_unlock

回来想想,这个还是单个任务的思路。如果任务多了没法解决。

2 任务怎么来管理,是不是一定要做任务队列。我自己做的第一版没这个,就会出现如果线程全忙,那么多的任务只有丢弃。所以任务队列是需要的。就算开始没想到,开始调试之后也会意识到这个问题。

3 接收任务和处理任务分离。这个只要做一下还是很容易就能想到。

4 多任务的情况下,只用互斥体行不行?很多网上的代码,都是互斥体和条件变量一起用。为什么要用条件变量,我开始是真的没想明白。

如果不使用条件变量,其实还真有解决方法。在工作线程中轮询。

WHILE TRUE:
    IF has task:
        process task
    IF not has task:
        sleep
    

这样就可以不用条件变量。但是这样做有一个问题就是占用CPU资源,sleep的时候占用了CPU资源,而用pthread_cond_wait可以不占用CPU。整体来说有点类似自旋锁spinlock和互斥体mutex的区别。在真实项目中,这个区别还是很大。

4 pthread_cond_wait前面为什么要套一个while,为什么不用if。比如

WHILE task not empty:
    pthread_cond_wait signal

这个也是一直迷惑的地方。查了一下GPT,说是防止虚假唤醒,多处理器场景。TODO,这块待确认。

可以先参考这篇:pthread_cond_wait为什么要使用while循环判断?_pthread_cond_wait while-优快云博客

https://www.cnblogs.com/lidabo/p/16669394.html

TODO 示范代码

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值