友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
第三电子书 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

C语言实例教程(PDF格式)-第74部分

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!



…………………………………………………………Page 649……………………………………………………………

象,访问数据。  



因为线程只有拥有Critical  Section对象才能访问数据,而且在一个 

时刻只有一个线程可以拥有Critical  Section对象,所以决不会出现 

一个时刻有多个线程访问数据。  



为了在MFC程序中创建一个Critical                     Section对象,你应当创建 

CcriticalSection类的对象,如下所示:  



CCriticalSection criticalSection  



然后,当程序代码准备访问你保护的数据时,你应当调用 

CCriticalSection的成员函数Lock(),  



criticalSection。Lock();  



如果另外一个线程并没有拥有criticalSection,Lock()将 

criticalSection给调用它的线程。这个线程便能够访问受保护的数 

据,此后它调用CcriticalSection的成员函数Unlock() :  



criticalSection。Unlock();  



Unlock()释放了对criticalSection的拥有权,这样其它线程就可以 

占有它并访问受保护的数据。  



最好的方法是将数据放在线程安全类中。当你这样做后,你不用担心 

在主线程中的线程同步,线程安全类会替你处理的。下面的类 

CCountArray便是一个线程安全类。  



以下是COUNTARRAY。H,CcountArray的头文件。  



#include 〃afxmt。h〃  



class CCountArray  



{  



private:  



int array'10';  



CCriticalSection criticalSection;  



public:  



CCountArray() {};  


…………………………………………………………Page 650……………………………………………………………

~CCountArray() {};  



void SetArray(int value);  



void GetArray(int dstArray'10');  



};  



在该头文件中包含一个MFC的头文件afxmt。h,以使程序可以使用 

CCriticalSection类。在CCountArray类的声明中,头文件声明了一 

个十个元素的整形数组,这是CCriticalSection类的对象将要保护的 

数据,并且声明了一个CCriticalSection类的对象 

criticalSection。CCountArray类的公共成员函数包含构造和析购函 

数。后面两个成员函数用于访问数据。  



下面是CCountArray类的执行文件。注意,在每一个成员函数中, 

CCountArray都在密切关注着CCriticalSection类的对象的状态。这 

也意味这任何调用这些成员函数的线程不必担心线程同步。例如,如 

果线程1调用了SetArray();SetArray()所做的第一件事就是调用 

criticalSection。Lock();这将把criticalSection给线程1,此后可 

以完成一个循环而不用担心被其它线程打断。如果线程2调用了 

SetArray()或GetArray();criticalSection。Lock()语句将挂起线程2 

直到线程1完成循环,执行criticalSection。Unlock()语句将对 

criticalSection的拥有权释放。这时系统唤醒线程2,并将 

criticalSection给它。通过这种方式,所有线程必须安静的等待它 

们访问数据的机会到来。  



下面是COUNTARRAY。CPP,CcountArray类的执行文件。  



#include 〃stdafx。h〃  



#include 〃CountArray。h〃  



void CCountArray::SetArray(int value)  



{  



criticalSection。Lock();  



for (int x=0; x
返回目录 上一页 下一页 回到顶部 1 1
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!