VC中多线程操作_第1页
VC中多线程操作_第2页
VC中多线程操作_第3页
VC中多线程操作_第4页
VC中多线程操作_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、在线程之间传送信号可以使用事件对象,用 MFC 的 CEvent 来表示。一个事件对象有两种状 态:信号态与非信号态。线程能监视于信号态的事件,以便在适当的时间完成对事件的操作。创建事件的语句如下:CEvent ThreadBegin;事件被创建后就自动处于非信号态,要使用它处于信息态,必须使用对件对象的成员函数SetEve nt(),即:ThreadBegin.SetEvent(); 线程监视这个信号来知道事件已准备就绪,从而可以进行其它的操作。而线程通过调用 API 函数WaitForSi ngleObject ()来监视这个信号。:WaitForSingleObject(ThreadBe

2、gin.m_hObject,INFINITE);该函数的两个参数分别表示要检查的事件句柄与函数等待事件时间。INFINITE告诉WaitForSingleObject。在特定的事件不处于信号态时不要返回,即把它放在 线程的开始的话,那么系统将挂起这个线程,直到事件处于信号态时才继续执行下去。当已 经准备好线程继续执行下去的条件时,调用SetEvent(),当线程获得了相应信号态信号后便 会继续执行下去。一旦线程不再被挂起时,它便可以完成相关事务。但若要在主程序中通过线程结束,那么线 程必须监视接下来的这个事件,看它是否处于信号态。线程可以通过对事件进行轮询,这时 只要调用WaitForSing

3、leObject()即可,只是等待时间参数的值被置为0,即::WaitForSingleObject(ThreadBegin.m_hObject,0);当返回WAIT_OBJECT_0时,表示事件处于信号态,否则处于非信号态。UINT ThreadProc(LPVOID param):WaitForSingleObject(ThreadBegin.m_hObject,INFINITE);:MessageBox(HWND)param,Thread Activated!,Thread,MB_OK);BOOL KeepRunning=true;while (KeepRunning)int Resul

4、t=:WaitForSingleObject(ThreadEnd.m_hObject,0);if (Result=WAIT_OBJECT_0) KeepRunning=false;:MessageBox(HWND)param,Thread Stopped!,Thread,MB_OK); return 0;启动线程则用如下代码:HWND hWnd=GetSafeHwnd();AfxBeginThread(ThreadProc,hWnd);ThreadBegin.SetEvent(); 本文即本人在学习多任务多线程过程的手记,供大家参考,望能得到各位指点。作者信箱: HYPERLINK mailt

5、o:devvy21 devvy21学习多线程之二:线程同步-使用临界区作者:惠州市东晓电子有限公司 龚辉斌下载本文示例源代码临界区是一种保证在某一时刻只有一个线程能访问数据的简便办法。不管哪一个线程占用临 界区对象,它都可以访问受保护的数据,而其他线程就必须等待,直到占用临界区的线程进行释放操作,从而临界区的数据是不会一个以上的线程同一时刻访问的。在 MFC 中通过 CCtiticalSection 类来创建临界区实例,如: CCriticalSection CriticalSection;当线程准备访问临界区的数据时,必须调用它的成员函数Lock()进行锁定,如: CriticalSecio

6、n.Lock();如果没有任何线程占用临界区,Lock()可以向调用纯种提供临界区数据的访问,当线程完成 各项数据操作后,再调用成员函数UnLock()进行释放,另啲线程才可以占用临界区。如: CriticalSection.UnLock();可以定义一个数据实例:class CDataArrayprivate:int iArray10;CCriticalSection CriticalSection;public:CDataArray();CDataArray();void SetData(int iValue);void GetDataArray(int aArray10);在头文件中必须

7、包含afxmt.h,它提供了程序对CCriticalSection的访问机制。void CDataArray:SetData(int iValue)CriticalSection.Lock();for (int i=0;i10;i+)iArrayi=iValue;CriticalSection.Unlock();void CDataArray:GetDataArray(int aArray10) CriticalSection.Lock();for (int i=0;i10;i+)aArrayi=iArrayi;CriticalSection.Unlock();增加数据实例:CDataArra

8、y DataArray;再编写读写函数:UINT Thread_WriteProc(LPVOID param)for (int i=0;i10;i+)DataArray.SetData(i); :Sleep(500);return 0;UINT Thread_ReadProc(LPVOID param)int aArray10;for (int i=0;i20;i+)DataArray.GetDataArray(aArray);char str255; str0=0;for (int j=0;j10;j+)int len=strlen(str); wsprintf(&strlen,%d,aAr

9、rayj); :MessageBox(HWND)param,str,Thread Read Proc,MB_OK);return 0;这样我们可以启动这两个线程函数:HWND hWnd=GetSafeHwnd();AfxBeginThread(Thread_WriteProc,hWnd); AfxBeginThread(Thread_ReadProc,hWnd);这 样 当 Thread_WriteProc 占 用 临 界 区 时 , Thread_ReadProc 必 须 等 待 , 直 到 Thread_WriteProc 退出了临界区,从而实现线程间的同步。本文即本人在学习多任务多线程过

10、程的手记,供大家参考,望能得到各位指点。 作者信箱: HYPERLINK mailto:devvy21 devvy21学习多线程之三:线程同步-使用互斥作者:惠州市东晓电子有限公司 龚辉斌下载本文配套代码互斥跟临界区很相似,便远比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线 程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。通 过 CMutex 来完成线程间的互质,即: CMutex Mutext;从而我们可以这样来定义数据对象#include afxmt.h class CDataArray private:int iArray10;CMutex Mut

11、ex; public:CDataArray(); CDataArray();void SetData(int iValue); void GetDataArray(int aArray10); ;成员函数实现如下:void CDataArray:SetData(int iValue)CSingleLock SingleLock(&Mutex);SingleLock.Lock();for (int i=0;i10;i+) iArrayi=iValue;void CDataArray:GetDataArray(int aArray10)CSingleLock SingleLock(&Mutex);

12、SingleLock.Lock();for (int i=0;i10;i+) aArrayi=iArrayi;为了访问一个互斥对象,务必建立一个 CSingleLock 或 CMultiLock 对象,用于访问控制。如 果互斥没有被线程占用,那么当前的调用线程可以成为互斥的占用者。要实现对互斥的访问,就要调用CSingleLock的成员函数Lock(),即:SingleLock.Lock();如果一个线程占用了互斥,那么系统将挂起当前的调用线程,直到这个互斥被释放为止,这 时,被挂起的线程将被唤醒并取得对互斥的控制。释放互斥是通过调用CSingleLock的成员函数UnLock()来实现的。C

13、DataArray的成员函数 在退出时,将自动进行解锁操作。因为CSingleLock被创建在椎栈上,系统自动完成对 Un Lock()的调用。本文即本人在学习多任务多线程过程的手记,供大家参考,望能得到各位指点。 作者信箱: HYPERLINK mailto:devvy21 devvy21学习多线程之四:线程同步-使用信号量作者:惠州市东晓电子有限公司 龚辉斌下载本文配套代码除了使用临界区与互斥可以完成线程间的同步外,还可以使用信号量CSemaphore。使用信 号量还有一个好处便是:信号允许多个线程同时使用共享资源,这便与操作系统中的PV操 作有些雷同的地方。它指出了同时访问共享资源的线程

14、最大数目。在信号量内部有一个计数器,当有线程访问共享资源时,计数器将自动递减,当它为 0 时, 不再允许其他线程对共享资源的访问,直到有一个线程释放共享资源,从而完成对共享资源 的保护。在建立一个信号量时必须提供一个初始化值和一个最大计数值,如:CSemaphore Semaphore(2,2); 可以在类的构造函数中动态地创建 CSemaphore 对象,如:Semaphore=new CSemaphore(2,2);信号量 CSemaphore 被建立后,就可以准备用它来对共享资源进行访问计数。要完成计数 处理,首先应建立一个 CSingleLock 或 CMultiLock 对象,如:C

15、SingleLock SingleLock(Semaphore);要减小这个信号Semaphore的计数值,只须调用CSingleLock对象的成员函数Lock()即可:SingleLock.Lock();同样,通过调用UnLock()来释放这个信号量,即:SingleLock.UnLock(); 从而我们可这样来申明类: #include afxmt.hclass CSharedResourceprivate:CSemaphore* ptrSemaphore;public:CSharedResource();CSharedResource();void AccessResource();在构

16、造函数中完成对信号对象的创建:CSharedResource:CSharedResource() ptrSemaphore=new CSemaphore(2,2); 在析构函数中完成对信号对象的释放: CSharedResource:CSharedResource()delete ptrSemaphore;用以下过程来访问共享资源:void CSharedResource:AccessResource()CSingleLock SingleLock(ptrSemaphore);SingleLock.Lock();/* 资源访问*/Sleep(1000);再建立使用信号量的线程函数:UINT T

17、hread_Proc1(LPVOID param)SharedResource.AccessResource();:MessageBox(HWND)param,Thread #1 had accessed the Semaphore!,Thread Proc1,MB_OK);return 0;UINT Thread_Proc2(LPVOID param)SharedResource.AccessResource();:MessageBox(HWND)param,Thread #2 had accessed theSemaphore!,Thread Proc2,MB_OK);return 0;UINT Thread_Proc3(LPVOID param)SharedResource.AccessResource();:MessageBox(HWND)param,Thread #3 had accessed theSemaphore!,Thread Proc3,MB_OK); return 0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论