多线程基础篇

内容主要为《windows核心编程第五版》

多线程在应用过程中主要的目标是解耦和同步

解耦:让一个小的模块依赖另一个模块变成依赖一个简单是信号,不用管是给的信号,只要给到了信号,我就执行对应的逻辑,这样的架构会让逻辑代码充分的解耦。

同步:同步资源的权限状态

线程

线程由内核对象和线程栈组成,线程默认1M的栈空间,默认预留一个页面的栈空间。在不够的时候会自动扩容,但是有大小限制。线程创建的时候会取连接器/STAXCK和cbStackaSIze两个值中更大的值为线程栈调拨所需的所有存储空间。

 线程上下文

线程始终运行在进程的上下文中,包含cpu的控制寄存器(属于该线程的CPU寄存器状态数据),比如指令指针,栈指针,标志和返回地址。

线程创建

在windows上使用CreateThread,如果使用c++原生线程使用_beginthreadex。

线程的挂起和恢复

新创建的线程的挂起计数都会被设置为1,这样就不会给这个线程调度cpu ,初始化完成后,根据从传入的CREATE_SUSPENDED标志设置挂起计数,如果有函数会返回并让新的线程处于挂起状态,如果没有,函数会将线程的挂起计数递减为0,当线程的挂起计数为0时,线程就成为可调度的。

线程可以被多次挂起,但是恢复的时候也要调用相同的次数。

任何线程都可以将一个线程挂起,但是被挂起的线程不能自己恢复。

线程睡眠

传入INFINITE系统将永远不会调度这个线程。传入0,系统会默认该线程自动放弃了剩余的时间片,系统调度其他线程。

线程优先级

线程的优先级受线程优先级和进程优先级影响,

硬性关联

系统将使线程在上一次运行的处理器上运行,让进程始终在同一个处理器上运行由卒于重用仍在处理器高速缓存中的数据。把若干cpu逻辑核分为若干个系统板(由多个cpu逻辑核心和内存组成),让进程在同一个系统板上运行性能将达到最佳。

SetProcessAffinityMask约束进程在掩码代表的cpu上运行。

线程终结

TerminateThread:能杀死任何线程。异步结束线程,需要使用WaitForSingleObjectEx保证线程已经终止。在进程终止的时候才会杀死线程。

ExitThread:杀死一个线程并清理堆栈。总是杀死主调线程

1.一个线程有两用户对象:窗口和挂钩,一个线程终止时,系统会自动销毁由线程创建或安装的任何窗口,并卸载由线程创建或安装的挂钩,其他对象只有在拥有线程的进程终止时才销毁。

2.线程退出码从STILL_ACTIVE编程传给退出线程方法的代码

3.内核对象编程触发状态

4.如果该线程是进程的最后一个进程,那么进程将被终止

 

posted @ 2022-12-20 18:03  过往云烟吧  阅读(49)  评论(0)    收藏  举报