线程同步

 #include "afxmt.h"

1、在线程之间传送信号可以使用事件对象,用MFC的CEvent来表示。一个事件对象有两种状态:信号态与非信号态。线程能监视于信号态的事件,以便在适当的时间完成对事件的操作。 CEvent ThreadBegin; 事件被创建后就自动处于非信号态,要使用它处于信息态,必须使用对件对象的成员函数SetEvent(),即: ThreadBegin.SetEvent(); 线程监视这个信号来知道事件已准备就绪,从而可以进行其它的操作。而线程通过调用API函数WaitForSingleObject()来监视这个信号。 ::WaitForSingleObject(ThreadBegin.m_hObject,INFINITE); 该函数的两个参数分别表示要检查的事件句柄与函数等待事件时间。 ::WaitForSingleObject(ThreadBegin.m_hObject,0); 当返回WAIT_OBJECT_0时,表示事件处于信号态,否则处于非信号态。

2、临界区 临界区是一种保证在某一时刻只有一个线程能访问数据的简便办法。不管哪一个线程占用临界区对象,它都可以访问受保护的数据,而其他线程就必须等待,直到占用临界区的线程进行释放操作,从而临界区的数据是不会一个以上的线程同一时刻访问的。 CCriticalSection CriticalSection; CriticalSection.Lock(); CriticalSection.UnLock();

3、互斥跟临界区很相似,便远比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。 CMutex Mutext;

void CDataArray::SetData(int iValue) {         CSingleLock SingleLock(&Mutex);         SingleLock.Lock();         for (int i=0;i<10;i++)                 iArray[i]=iValue; }

void CDataArray::GetDataArray(int aArray[10]) {         CSingleLock SingleLock(&Mutex);         SingleLock.Lock();         for (int i=0;i<10;i++)                 aArray[i]=iArray[i]; } 释放互斥是通过调用CSingleLock的成员函数UnLock()来实现的。CDataArray的成员函数在退出时,将自动进行解锁操作。因为CSingleLock被创建在椎栈上,系统自动完成对UnLock()的调用。 

4、 除了使用临界区与互斥可以完成线程间的同步外,还可以使用信号量CSemaphore。使用信号量还有一个好处便是:信号允许多个线程同时使用共享资源,这便与操作系统中的PV操作有些雷同的地方。它指出了同时访问共享资源的线程最大数目。在信号量内部有一个计数器,当有线程访问共享资源时,计数器将自动递减,当它为0时,不再允许其他线程对共享资源的访问,直到有一个线程释放共享资源,从而完成对共享资源的保护。 CSemaphore Semaphore(2,2); CSingleLock SingleLock(Semaphore); SingleLock.Lock(); SingleLock.UnLock();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值