十三、补充知识、线程池、数量谈

一、补充知识

1、虚假唤醒

wait中要有第二参数(lambda)并且这个lambda中要正确判断要处理的公共数据是否存在

wait,notify_ont/notify_all

notify_all(),一个线程取到了数据,另一个线程唤醒了但是取不到数据了(容器为空),这就是虚假唤醒

2、atomic

读到的atm值可能不是实时的atm值。

atomic<int> atm

auto atm2 = atm;//不允许,拷贝构造函数踢掉了

atomic<int> atm2(atm.load());//允许,load函数就是以原子方式读atomic对象的值

auto atm3(atm.load());//允许

atm2.store(12);//store以原子方式写入内容

二、线程池

1、场景设想

服务器程序,客户端,每来一个客户端,就创建一个线程为新用户提供服务。

如果来了10000个客服,不可能为每个客户都创建新线程。

编写的代码中,偶尔创建一个线程,这种写法让人不安,如果没创建成功,整个程序就崩溃了。稳定性问题。

线程池:把一堆线程弄到一起,统一管理,循环利用线程的方式就叫线程池。

2、实现方式

在程序启动时候一次性创建好一定数量的线程,10,8,100-200。

就不会因为临时创建线程浪费时间,浪费系统资源。

程序更稳定,让人更放心。

三、线程创建数量谈

2000个线程是极限

创建数量建议:

1、采用某些技术开发程序,接口提供商会建议一些数量,遵照建议和指示

2、创建多线程完成业务,一个线程等于一条执行通路;100个要堵塞充值(充值要反馈到一个服务器,等待服务器返回,所以会堵塞),那开110个线程是合适的。

线程数量不要超过500个,

四、

原文地址:https://www.cnblogs.com/pacino12134/p/11271547.html