一.补充
1.1)虚假唤醒:即wait被唤醒,共享数据队列中没有数据,比如连续多次notify_one()等操作会导致此种情况发生
在多线程学习(七)中介绍了wait(),notify_one(),notify_all()
当时我们使用lambda表达式已经将虚假唤醒考虑在内了,也就是lambda表达式返回false时,wait()继续等待被再次唤醒
故wait中要有第二个参数(lambda),并且这个lambda表达式要正确判断公共数据是否存在
1.2)atomic:原子操作
在多线程学习(九)中有介绍
主要说明cout<<atom<<endl;这个语句,atom是个原子对象,注意:读取atom是原子操作,但cout是将其输出到屏幕上,这个过程不是原子的,故输出到屏幕上的值很可能是atom的曾经值
auto atom2=atom;这种定义初始化操作是不允许的,在编译器内部删除了拷贝构造函数,即拷贝构造函数=delete
当然 atomic<int> atom2;atom2=atom;也是不允许的
下面两种是常用用法:
load();以原子方式读atomic对象的值:atomic<int> atom2(atom.load)
store()以原子方式写入内容:atom2.store(12)
二.浅谈线程池
2.1)场景设想
服务器程序--》客户端,每来一个客户端,就创建一个新线程为该客服提供服务
a)如网络游戏,2万玩家不可能给每个玩家创建新线程,此写法在这种场景下不适用。
b)程序稳定性问题:编写的代码中,偶尔创建一个线程,这种代码让人感到不安
线程池:把一堆线程放在一起,统一管理。这种统一管理,循环利用线程的方式叫做线程池
2.2)实现方式
在程序启动时,一次性创建好一定数量的线程
三.线程创建数量
3.1)线程开的数量极限问题:2000个线程基本就是极限,再创建线程就崩溃
3.2)线程创建数量建议
a)采用某些技术开发程序:API接口提供商建议 创建线程数量=cpu数量,cpu*2等等,遵照专业建议和指示,确保程序高效执行
b)创建多线程完成业务,一个线程等于一条执行通路;100要堵塞充值,开110个线程是很合适的
c)1800个线程,建议线程数量不要超过500个,控制在200个之内是比较理想的
网友评论