MFC线程同步

原创 2012年03月24日 21:13:49

一.事件

可以使用CEvent对象发出通知信号,通知系统是否可以运行等待线程

假设有三个线程Thread1,Thread2,Thread3,一个全局的CEvent 对象oEvent

CEvent oEvent();//等待于(CEvent oEvent(FALSE,FALSE),即(禁止发信,非手动[自动事件])


 线程函数定义如下:

UINT Thread1(LPVOID pParam)
{
    ......
    oEvent.Lock();
    ......
}

UINT Thread2(LPVOID pParam)
{
    ......
    oEvent.Lock();
    ......
}

UINT Thread3(LPVOID pParam)
{
    ......
    oEvent.SetEvent();
    ......
}

假设调用过程为:

	AfxBeginThread(Thread1,"Thread1 start");
	AfxBeginThread(Thread2,"Thread2 start");

这样就启动了两个线程,不过都执行到oEvent.Lock()的时候就停止了运行(可以理解为线程入栈).因为此时的oEvent.bInitiallyOwn=FALSE,即禁止发信

这里再启动Thread3,执行到oEvent.SetEvent()的时候,oEvent.binitiallyOwn=TRUE;此时系统发出一个信号通知阻塞的线程,通知的顺序按先进后出的顺序(线程出栈),如上的例子就是先是Thread2被唤醒,Thread2被唤醒之后,马上就将OEvent.bInitiallyOwn的值设置为FALSE,这是CEvent的构造函数第二个参数的意义,自动停止发信.


假如CEvent oEvent(FALSE,TRUE),即创建了一个手动事件对象,与上边自动不同的是,在调用 SetEvent()的时候会将所以线程栈当中的阻塞线程一次过唤醒而不停止.


二.临界段

临界是一个公共的资源,当有一个线程希望获取(主要是修改)临界资源的时候,应该先向系统申请,先建立一个对象:

	CCriticalSection criticalSection;

在需要访问临界的线程前加上资源锁:

	criticalSection.Lock();
如果资源没有被其他线程用(锁),就获取资源,否则就阻塞.

当这个线程用完资源后,要用

	criticalSection.UnLock();
来解除资源锁定,否则其他以后都不能再访问到临界资源

三.互斥体

基本与临界一样,只不过临界限定的范围在本进程内,而互斥在不同进程之间都可以互斥

     声明:

	CMutex mutexObj(FALSE,"mutex1");//(初始是否锁定,互斥名)
	mutexObj.Lock();
	mutexObj.UnLock();

三.信号量

信号量就是限制进程同一时间对共享资源同时访问的线程数上限,其他跟临界一样.

	CSemaphore semaphorObj(2,3);//(计数器初始值,计数器最大值)
	semaphorObj.Lock();//计数器减一,如果为0,则线程阻塞
	semaphorObj.Unlock();//计数器加一





<MFC笔记> 四种线程同步(或互斥)方式小结

一,什么是线程同步? 同步就是协同步调,按预定的先后次序进行运行。如:你说完,我再说。这里的同步千万不要理解成那个同时进行,应是指协同、协助、互相配合。 线程同步是指多线程通过特定的设置(如互斥量,...
  • EbowTang
  • EbowTang
  • 2014年06月10日 21:35
  • 2124

MFC多线程编程之四——线程的同步

八、线程的同步 虽然多线程能给我们带来好处,但是也有不少问题需要解决。例如,对于像磁盘驱动器这样独占性系统资源,由于线程可以执行进程的任何代码段,且线程的运行是由系统调度自动完成的,具有一定的不确定...
  • Arcsinsin
  • Arcsinsin
  • 2013年11月19日 22:11
  • 3088

C++多线程同步技术(MFC)

1. 何时使用同步类     MFC 提供的多线程类分为两类:同步对象(CSyncObject、CSemaphore、CMutex、CCriticalSection 和 CEvent)和同步访问对象...
  • wcyoot
  • wcyoot
  • 2012年03月19日 22:43
  • 3231

线程同步之EVENT

Applications can use event objects in a number of situations to notify a waiting thread of the occu...
  • chuchus
  • chuchus
  • 2014年08月14日 22:45
  • 816

MFC(4) MFC中使用事件(event)来线程同步

MFC中的Event以类比linux中的cond,条件变量——wait and signal OpenDevice.h #pragma once class OpenDevice { p...
  • luoyouren
  • luoyouren
  • 2015年04月05日 16:45
  • 3045

MFC线程同步——CEvent的使用

WaitForSingleObject函数用来检测hHandle事件的信号状态,当函数的执行时间超过dwMilliseconds就返回,但如果参数dwMilliseconds为INFINITE时函数将...
  • u011519892
  • u011519892
  • 2014年02月18日 14:14
  • 1804

MFC线程同步

MFC线程同步 *为什么要进行线程同步? 线程是非常好的程序设计方法,线程可以简化程序设计,而且线程也极大的改善了程序性能,但是 ,使用线程要小心,比如多个线程同时使用了...
  • qq_33001647
  • qq_33001647
  • 2017年01月01日 11:31
  • 211

MFC 线程同步

转自:http://blog.csdn.net/akof1314/article/details/5764200 在多线程的情况下,如果存在多个线程要使用同一个资源的情况时,则需要在线程...
  • Maybe______
  • Maybe______
  • 2016年08月27日 18:06
  • 269

C++线程同步的四种方式(Windows)

为什么要进行线程同步?  在程序中使用多线程时,一般很少有多个线程能在其生命期内进行完全独立的操作。更多的情况是一些线程进行某些处理操作,而其他的线程必须对其处理结果进行了解。正常情况下对这种处理结果...
  • s_lisheng
  • s_lisheng
  • 2017年07月03日 23:20
  • 271

线程同步(同步对象、同步访问对象)

在多线程的情况下,如果存在多个线程要使用同一个资源的情况时,则需要在线程之间进行协调(同步)才能使程序完成预定的工作,而不会出现灾难性的冲突。...
  • akof1314
  • akof1314
  • 2010年07月25日 10:46
  • 6031
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC线程同步
举报原因:
原因补充:

(最多只允许输入30个字)