最近在看windows核心,顺便复习一下多线程的方法,这边是windows的多线程方法,不适用于linux
首先,最简单的,创建多线程,并且主线程和新线程都循环输出一些内容做比较:
关闭线程句柄不会导致线程不执行,而是创建子线程的这个线程不关心子线程后续执行情况,引用计数减1,正常情况这是一个很好的编程习惯。
我们会发现输出很奇怪,这是因为俩个线程公用一个cout流对象,无论是时间片轮询执行了这俩个线程,还是俩个核分别执行了,最终是没有控制往cout流对象里插入的需要输出的字节的,可能一个线程输出endl分隔符之前,流对象里又插入了另一个线程要输出的东西就会出现这个现象。
为了避免这种现象,可以用互斥量来实现(实际上互斥量(或者信号量,事件等都)涉及内核对象的状态切换,性能比基于用户对象的读写锁,或者关键段等性能差,windows核心重点讲了这个,但是目前接触到的项目代码都是用的互斥量,我这边也先用互斥量来保证流对象数据的安全)
还为了看出多线程的有点,最简单的就是加了Sleep睡眠函数,挂起线程,代码如下:
如果是单线程,则至少需要 20*150+20*200 ,即7000ms,但是实际上运行结果可以看出 实际上4049ms,基本上就是主线的耗时,如果这个实际的休眠是在执行其他任务的耗时,则可以看出多线程可以有效的利用cpu