WEB开发网
开发学院软件开发VC MFC教程(8)-- MFC的进程和线程 阅读

MFC教程(8)-- MFC的进程和线程

 2010-03-25 20:35:10 来源:WEB开发网   
核心提示:线程同步同步可以保证在一个时间内只有一个线程对某个资源(如操作系统资源等共享资源)有控制权,共享资源包括全局变量、公共数据成员或者句柄等,MFC教程(8)-- MFC的进程和线程(5),同步还可以使得有关联交互作用的代码按一定的顺序执行,Win32提供了一组对象用来实现多线程的同步,当一个进程或线程结束时,进程或线程句

线程同步

同步可以保证在一个时间内只有一个线程对某个资源(如操作系统资源等共享资源)有控制权。共享资源包括全局变量、公共数据成员或者句柄等。同步还可以使得有关联交互作用的代码按一定的顺序执行。

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)

例如,当一个进程或线程结束时,进程或线程句柄获得信号,等待该进程或者线程结束的线程被释放。

上一页  1 2 3 4 5 6 7 8 9 10  下一页

Tags:MFC 教程 MFC

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接