有一说一,线程池其实在国内用的不多。就算是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 示范代码
本文讨论了线程池的基本概念,涉及的问题包括:仅用互斥体是否可行、任务管理(队列)、接收任务与处理任务分离以及在多任务下使用条件变量的必要性。作者还探讨了自旋锁与互斥体的区别以及`pthread_cond_wait`前的while循环的作用。
170万+





