进程与线程
进程是程序执行时的一个实例,即它是程序已经执行到何种程度的数据结构的汇集。从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。
线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。一个进程由几个线程组成(拥有很多相对独立的执行流的用户程序共享应用程序的大部分数据结构),线程与同属一个进程的其他的线程共享进程所拥有的全部资源。
进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
线程函数
HANDLE CreateThread();
CloseHandle(hThread);
线程的同步
- 临界区(CCriticalSection)
- 事件(CEvent)
- 互斥量(CMutex)
- 信号量(CSemaphore)
l 临界区: CRITICAL_SECTION,最容易使用
适用范围: 单一进程的各线程之间用来排它性占有特性: 局部性对象; 快速而有效.
函数: EnterCriticalSection LeaveCriticalSection
l 事件Event:
适用范围: 同来控制对象信号的接收,常与信号系统结合起来特性:
核心对象函数: CreateEvent OpenEvent PulseEvent SetEvent ResetEvent
l 互斥Mutex:
适用范围: 不同线程之间用来排它性占有特性: 核心对象(跨进程), 可以使用wait进行等待,只能被拥有线程所释放。
互斥对象与临界区对象很像.互斥对象与临界区对象的不同在于:互斥对象可以在进程间使用,而临界区对象只能在同一进程的各线程间使用。当然,互斥对象也可以用于同一进程的各个线程间,但是在这种情况下,使用临界区会更节省系统资源,更有效率。
函数:CreateMutex ReleaseMutex
l 信号量semaphore:
适用范围: 用来限制资源占用特性: 核心对象,没有拥有者,任何线程都可释放
函数:CreateSemaphore OpenSemaphore ReleaseSemaphore