白云区网站开发公司,wordpress 栏目插件,自己制作网站做外贸赚钱吗,深圳沙头网站建设C11并发与多线程笔记#xff08;13#xff09; 补充知识、线程池浅谈、数量谈、总结 1、补充一些知识点1.1 虚假唤醒#xff1a;1.2 atomic 2、浅谈线程池#xff1a;3、线程创建数量谈#xff1a; 1、补充一些知识点
1.1 虚假唤醒#xff1a;
notify_one或者notify_al… C11并发与多线程笔记13 补充知识、线程池浅谈、数量谈、总结 1、补充一些知识点1.1 虚假唤醒1.2 atomic 2、浅谈线程池3、线程创建数量谈 1、补充一些知识点
1.1 虚假唤醒
notify_one或者notify_all唤醒wait()后实际有些线程可能不满足唤醒的条件(例如多个notify_one语句唤醒或者多个“out函数“取数据就会造成虚假唤醒可以在wait中再次进行判断解决虚假唤醒。 解决wait中要有第二个参数lambda并且这个lambda中要正确判断所处理的公共数据是否存在。
//第8节
my_cond.wait(myUniLock, [] {if (!test_list.empty())return true;return false;});1.2 atomic
std::atomicint atm 0;
cout atm endl;这里只有读取atm是原子操作但是整个这一行代码 cout atm endl; 并不是原子操作(中间有多个操作导致最终显示在屏幕上的值是一个“曾经值”。
std::atomicint atm 0;
auto atm2 atm; //不可以//这种定义时初始化操作不允许显示尝试引用已删除的函数编译器内部肯定把拷贝构造函数给干掉了
atomicint atm3atm;//不可以atomicint atm2(atm.load()); load()以原子方式读atomic对象的值。
atm2.store(12); store()以原子方式写atomic对象的值。 原子操作实质上是不允许在进行原子对象操作时进行CPU的上下文切换。
2、浅谈线程池
场景设想服务器程序每来一个客户端就创建一个新线程为这个客户提供服务。
问题 有2万个玩家不可能给每个玩家创建一个新线程此程序写法在这种场景下不通。 程序稳定性问题编写代码中“时不时地突然”创建一个线程(来个上下文切换这种写法一般情况下不会出错但是不稳定的
线程池把一堆线程弄到一起统一管理。这种统一管理调度循环利用的方式就叫做线程池。
实现方式程序启动时一次性创建好一定数量的线程。这种方式让人更放心觉得程序代码更稳定。
3、线程创建数量谈 线程创建的数量极限的问题 一般来讲2000个线程基本就是极限再创建就会崩溃。 线程创建数量建议 a、采用某些技术开发程序提供的建议遵照建议创建线程数量cpu数量和指示来确保程序高效执行。 b、创建多线程完成业务考虑可能被阻塞的线程数量创建多余最大被阻塞线程数量的线程如100个线程被阻塞再充值业务开110个线程就是很合适的 c、线程创建数量尽量不要超过500个尽量控制在200个之内