友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
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
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!