MFC 线程同步问题

原创 2013年12月02日 14:36:28

一.事件

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

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

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


 线程函数定义如下:

  1. UINT Thread1(LPVOID pParam)  
  2. {  
  3.     ......  
  4.     oEvent.Lock();  
  5.     ......  
  6. }  
  7.   
  8. UINT Thread2(LPVOID pParam)  
  9. {  
  10.     ......  
  11.     oEvent.Lock();  
  12.     ......  
  13. }  
  14.   
  15. UINT Thread3(LPVOID pParam)  
  16. {  
  17.     ......  
  18.     oEvent.SetEvent();  
  19.     ......  
  20. }  
UINT Thread1(LPVOID pParam)
{
    ......
    oEvent.Lock();
    ......
}

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

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

假设调用过程为:

  1. AfxBeginThread(Thread1,"Thread1 start");  
  2. AfxBeginThread(Thread2,"Thread2 start");  
       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()的时候会将所以线程栈当中的阻塞线程一次过唤醒而不停止.


二.临界段

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

  1. CCriticalSection criticalSection;  
     CCriticalSection criticalSection;

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

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

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

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

三.互斥体

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

    声明:

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

三.信号量

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

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

使用MFC过程中遇到的问题以及解决方法(二)

昨天在同事的建议下写了自己的第一篇博客,当然现在想想自己应该感到羞愧才对,学习编程,也有半年多了,正式开始使用编程语言进行工作也有几个月了,到现在都没有养成记录自己遇到的问题和新学到的知识技能.之前的...
  • z5622139
  • z5622139
  • 2017年03月09日 20:40
  • 311

MFC常见面试问题(持续更新)

1)说说mfc中的类继承图的基本框架, 2)说说CView类的子类都有什么。 视图类(CView)的三个子类 CScrollView类提供视图的滚动显示;CEditView类支持在视图中的...
  • zxccaoya
  • zxccaoya
  • 2017年01月16日 18:46
  • 1733

MFC子对话框初始化问题_从一个“断言”报警说起

1.问题描述 在进行MFC开发时,希望将界面变得美观。因而调整了一下对话框上的字体与颜色。如果仅有一个对话框,那么直接把这些初始化的代码放到OnInitDialog()函数中就好。然而,我们...
  • shenziheng1
  • shenziheng1
  • 2016年11月23日 17:25
  • 1081

<MFC笔记>临界区,互斥量,信号量,事件的区别

四种进程或线程同步互斥的控制方法 1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。  2、互斥量:为协调共同对一个共享资源的单独访问而设计的。  3、信号量:为控制...
  • EbowTang
  • EbowTang
  • 2014年06月12日 15:07
  • 989

MFC控件自绘之(七)

MFC中的CDC,CClientDC,CPaintDC,CWindowDC的区别 CDC是Windows绘图设备的基类。 CClientDC:  (1)(客户区设备上下文)用于客户区的输出,与特定窗口...
  • feixiangyue
  • feixiangyue
  • 2014年01月22日 11:18
  • 722

MFC/VC DLL导出对话框,焦点混乱问题

vs创建dll,然后在dll里面创建对话框,并通过导出函数的方式创建时,会碰到各种各样的问题。比如edit控件获取不了焦点,无法输入;子对话框无法移动;各种button的焦点混乱等各种问题。 原因分...
  • mengxingxia
  • mengxingxia
  • 2017年07月20日 09:40
  • 233

MFC遇到的问题总结

1. 使用类调用对话框,有时弹不出来。嵌入时有时嵌不进去。 弹不出来试着调一调属性中的Visible选项,嵌不进去试着调一调属性里面的Style选项。 2....
  • jiang111_111shan
  • jiang111_111shan
  • 2016年06月23日 18:13
  • 610

MFC常见函数详解:SetRegistryKey

在利用mfc框架的时候,在App应用类的InitInstance()函数中,初始化时总有一个 SetRegistryKey("字符串XXX"),不知道究竟有何用处,这天仔细查看了一下,发现如果你使用注...
  • wanglei9876
  • wanglei9876
  • 2014年11月09日 22:38
  • 754

windows程序托盘图标以及消息提示--示例程序

之前两个博客介绍一些基本姿势,都是msdn上的,今天就介绍一下如何使用吧。为了简单起见,还是创建一个MFC based on dialog 功能吧。1创建托盘图标,封装了成一个函数:NOTIFYICO...
  • wangshubo1989
  • wangshubo1989
  • 2015年10月31日 14:56
  • 3128

基于MFC编写Windows服务程序

近期由于项目需要,编写了一个基于MFC对话框的Windows服务程序,现把方法和大家分享一下,希望高手指正。程序实现的基本功能如下: 1、 注册为Windows服务程序,随系统启动 2、 作为服务...
  • zhangxi8211
  • zhangxi8211
  • 2016年03月17日 16:22
  • 908
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC 线程同步问题
举报原因:
原因补充:

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