多线程总贴
进程
从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 原子操作,能够不被中断的一直执行完的操作