多线程总贴
进程
从Win32的角度来看,进程含有内存和资源,进程拥有的内存最大可高达2GB。
内存
1. Code 只读的,这是CPU唯一允许执行的内存
2. Data 包括程序中的变量,不包括函数中的局部变量,分为全局变量和静态变量
3. Stack 调用函数时使用,包含局部变量,每个线程创建时都有一个Stack
资源
1. 核心对象-文件句柄,线程等
2. 用户资源-窗口,对话框,字符串等
3. GDI资源-Device Context和Brushes等
进程本身并不能够执行,它只是提供一个安置内存和线程的地方,Matt Pietrek在其Windows 95 System Programming SECRETS一书中的解释是:进程就是一大堆对象拥有权的集合,也就是说,进程拥有对象,进程可以拥有内存(更确切的说是memory context),可以拥有file handles,可以拥有线程,可以拥有一大串DLL模块(被载入这一进程的地址空间)。
线程
一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。
为什么使用多线程而不使用多进程?
线程比进程廉价,启动和退出更快,占用资源更小,切换更容易。
Atomic Operation
同步和异步
同步的(synchronous) 同步synchronization
异步的(asynchronous) 异步asynchronization
假设有两个程序A和B,当程序A调用B时,A停下来不动,直到B执行完以后A才继续执行,这就是所谓的synchronous,若A调用B后,直接继续执行而不管B的状态,这就是所谓的asynchronous,在Win32 API中,SendMessage()是同步行为,而PostMessage()是异步行为。
SendMessage在发送完消息后,会等待该消息处理完毕再返回继续执行,而PostMessage则是发完消息就指着执行,不管发出的消息是否被处理完。
Mutex和Critial Section比较
1. 等待Mutex比等待Critical Section的时间要长100倍,因为前者是核心对象,后者不是,前者必须进入kernal mode才起作用,后者在user mode就可以了
2. 前者可以跨进程使用,而后者只能在同一个进程内使用
3. 前者可以指定等待时间,超过该时间则不再等待,后者不能。
注:Mutex是Mutual Exclusion的缩写
跨进程使用Mutex
可以给Mutex对象指定名称,其他线程可以用名称来处理该mutex,注意mutex的名称是系统唯一的,所以要使用独一无二的名字。
Glossary
cooperative 合作的
preemptive 抢占的 preemptive multitasking 抢占式多任务
二者的区别是,前者不能打断正在运行的任务,后者则可以。
Atomic Operation 原子操作,能够不被中断的一直执行完的操作
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述