MFC教程(8)-- MFC的进程和线程
2010-03-25 20:35:10 来源:WEB开发网线程同步
同步可以保证在一个时间内只有一个线程对某个资源(如操作系统资源等共享资源)有控制权。共享资源包括全局变量、公共数据成员或者句柄等。同步还可以使得有关联交互作用的代码按一定的顺序执行。
Win32提供了一组对象用来实现多线程的同步。
这些对象有两种状态:获得信号(Signaled)或者没有或则信号(Not signaled)。线程通过Win32 API提供的同步等待函数(Wait functions)来使用同步对象。一个同步对象在同步等待函数调用时被指定,调用同步函数地线程被阻塞(blocked),直到同步对象获得信号。被阻塞的线程不占用CPU时间。
同步对象
同步对象有:Critical_section(关键段),Event(事件),Mutex(互斥对象),Semaphores(信号量)。
下面,解释怎么使用这些同步对象。
关键段对象:
首先,定义一个关键段对象cs:
CRITICAL_SECTION cs;
然后,初始化该对象。初始化时把对象设置为NOT_SINGALED,表示允许线程使用资源:
InitializeCriticalSection(&cs);
如果一段程序代码需要对某个资源进行同步保护,则这是一段关键段代码。在进入该关键段代码前调用EnterCriticalSection函数,这样,其他线程都不能执行该段代码,若它们试图执行就会被阻塞。
完成关键段的执行之后,调用LeaveCriticalSection函数,其他的线程就可以继续执行该段代码。如果该函数不被调用,则其他线程将无限期的等待。
事件对象
首先,调用CreateEvent函数创建一个事件对象,该函数返回一个事件句柄。然后,可以设置(SetEvent)或者复位(ResetEvent)一个事件对象,也可以发一个事件脉冲(PlusEvent),即设置一个事件对象,然后复位它。复位有两种形式:自动复位和人工复位。在创建事件对象时指定复位形式。。
自动复位:当对象获得信号后,就释放下一个可用线程(优先级别最高的线程;如果优先级别相同,则等待队列中的第一个线程被释放)。
人工复位:当对象获得信号后,就释放所有可利用线程。
最后,使用CloseHandle销毁创建的事件对象。
互斥对象
首先,调用CreateMutex创建互斥对象;然后,调用等待函数,可以的话利用关键资源;最后,调用RealseMutex释放互斥对象。
互斥对象可以在进程间使用,但关键段对象只能用于同一进程的线程之间。
信号量对象
在Win32中,信号量的数值变为0时给以信号。在有多个资源需要管理时可以使用信号量对象。
首先,调用CreateSemaphore创建一个信号量;然后,调用等待函数,如果允许的话,则利用关键资源;最后,调用RealeaseSemaphore释放信号量对象。
此外,还有其他句柄可以用来同步线程:
文件句柄(FILE HANDLES)
命名管道句柄(NAMED PIPE HANDELS)
控制台输入缓冲区句柄(CONSOLE INPUT BUFFER HANDLES)
通讯设备句柄(COMMUNICTION DEVICE HANDLES)
进程句柄(PROCESS HANDLES)
线程句柄(THREAD HANDLES)
例如,当一个进程或线程结束时,进程或线程句柄获得信号,等待该进程或者线程结束的线程被释放。
更多精彩
赞助商链接