我的c++线程池项目学习收获

1、为啥要用线程池

        线程的创建和销毁都是需要时间的,如果业务量大,临时去创建大量线程,业务完成后销毁线程,是需要消耗很多时间的,系统性能会下降,业务需求也跟不上。

2、并发和并行

        并发:cpu只有一个核心,多个任务执行时占用不同的cpu时间片,由于占用的时间片很短,所以看似是在同时执行这些任务。这个场景就叫并发。      

        并行:cpu有多个核,每个任务由不同的核进行调度,所以是真正意义上同时执行这些任务。

3、多线程程序一定好吗?

        io密集型(涉及很多io操作,比如文件、网络(监听等待连接)、设备):单核和多核cpu都适合。如果是单核的话,当io操作阻塞时,会将该线程放入阻塞队列,cpu调度的是就绪队列的任务,cpu就不会调度该线程,不消耗cpu资源。

        cpu密集型(涉及很多运算操作):多核的合适,多个线程并行,cpu利用率好;单核不合适。因为单核的在cpu进行计算时,线程调度会有额外开销;线程越多,所花费的时间越多,所进行的上下文切换需要消耗很多资源,所以还不如单线程程序。

4、线程越多越好吗?

        不一定

 1、线程的创建和销毁是很重的操作。创建线程在内核空间完成,涉及到用户空间和和内核空间的切换。线程创建销毁越多,所设计的切换就越多,就会消耗很多资源。

2、创建线程需要消耗栈空间,而栈空间是固定的,线程越多,占用的空间就越多,留给其他程序的空间就越少。

3、线程的上下文切换也需要消耗时间。线程越多,上下文切换消耗的时间就越多,cpu的利用率就下降了。

4、如果大量线程阻塞,比如等待io的时候,甚至等待同一个io,如果同一时间io就绪,就会有大量的线程开始执行,此时系统就会有很大的负载

        那些著名的线程池项目,他们的线程数量是按照cpu核心来确定的。

5、线程同步

        主要有以下两种场景,Linux使用pthread,c++使用thread库

1、线程互斥

        场景比如多个线程执行同一块代码段

        程序能否在多线程环境下执行,是看它代码是否存在竟态条件(代码在多线程下执行,随线程调度顺序不同,执行结果不同),如果存在,那么这部分代码就称为临界区代码,就需要进行原子操作。

        如果多线程下存在竟态条件,那么就是不可重入的;

        如果不存在竟态条件,那么就是可重入的

        一般加互斥锁,保证原子操作,如果需要频繁上锁开锁,可以用乐观锁(活锁)。

        如果只涉及一个小的变量,加锁又浪费了的话,可以把这个变量设置为原子类型        

2、线程通信

        场景比如多个线程执行不同的代码段

        可以通过条件变量和信号量(c++是20才有该机制)实现。

   条件变量:

        通过mutex和condition_variable(条件变量)实现

        多线程可以看作一个生产者消费者模型,当容器满了之后,生产者会等待消费者消费,这时候会执行cont.wait()【注意:这里参数,linux下传入mutex互斥锁,c++传入智能锁unique_lock】

然后cond.notify_all(),通知消费者消费。notify之后。消费者就会从等待变为阻塞状态

        如果生产者抢到了锁,则消费者会进入阻塞状态/

        wait有两个作用,改变线程状态和释放互斥锁。比如生产者就会改变线程状态为等待。

        消费者进行消费,若容器内没有东西,则会wait,然后cond.notify_all(),通知生产者消费。

信号量:

        可以看作资源计数没有上限的互斥锁,比较轻量级,比如两个线程的通信就可以用它完成。它的控制没有条件变量精细。

        sem.post,信号量资源+1,sem.wait,等到信号量有资源。

        二元信号量(资源计数为0或1)可以看作是互斥锁,可以实现互斥锁的功能。但是两者的区别是:互斥锁只能由上锁的线程来释放,而sem信号量其他线程也可以进行post或wait调度。

6、收获

        做人脸识别项目的时候,因为识别很耗时,所以说用了多线程来实现,所以就对线程池感兴趣,就做了这个项目。

        线程池作为5大池之一它的应用很广泛,不管是客户端程序,还是后台服务程序,都是提高业务能力的必备模块,有很多来源的线程池实现,虽然实现各不相同,但核心实现原理都差不多

        可以用到哪些地方?高并发网络服务器、耗时任务处理、master-slave线程模型

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值