多个线程访问临界区时,可以使用临界区对象。临界区对象是一个独占性共享资源,任一时刻只有一个线程可以拥有临界区。拥有临界区的线程可以访问被保护起来的资源或代码段,其他希望进入临界区的线程将被挂起等待,直到拥有临界区的线程放弃临界区时为止。

CCriticalSection类的用法:

方法一:

(1)定义CCriticalSection类的一个全局对象(以使各个线程均能访问):

CCriticalSectioncritical_section;

(2)在访问临界区之前,调用CCriticalSection类的成员函数Lock()获得临界区:

 critical_section.Lock();

在线程中调用该函数来使线程获得它所请求的临界区。如果此时没有其他线程占有临界区,则调用Lock()的线程获取临界区;否则,线程即将挂起,并放入到一个系统队列中等待,直到当前拥有临界区的线程释放了临界区时为止。

(3)在本线程中访问临界区中的共享资源。

(4)访问临界区完毕后,使用CCriticalSection类的成员函数UnLock()来释放临界区:

critical.section.UnLock();

方法二:

与同步辅助类CSingleLock或CMutiLock类一起使用

(1)定义CCriticalSection类的一个全局对象(以使各个线程均能访问):

CCriticalSection critical_section;

(2)在访问临界区之前,定义CSingleLock类的一个对象,并将critical_section的地址传送给构造函数:

CSingleLocksinglelock(&critical_section);

(3)使用CSingleLock类的成员函数Lock()请求获得临界区:

  singlelock.Lock();

(4)在本线程中访问临界区中的共享资源。

(5)调用CSingleLock类的成员函数UnLock()来释放临界区:

singlelock.UnLock();


方法一:

定义一个CCriticalSection类的一个全局变量和一个共享资源的字符数组g_Array
CCriticalSection critical_section;
TCHAR g_Array[10] = _T("\0");

定义2个线程,共享g_Array数组资源
UINT WriteA(LPVOID pParam);
UINT WriteB(LPVOID pParam);
//pParam为创建afxBeginThread()函数的第二个参数
UINT WriteA(LPVOID pParam)
{CEdit *pEdit = (CEdit*)pParam; //pEdit为控制EDITA编辑框pEdit->SetWindowText(_T(""));critical_section.Lock(); //上锁//临界区for (int i = 0; i < 9; i++){g_Array[i] = _T('A');pEdit->SetWindowText(g_Array);Sleep(1000);}critical_section.Unlock();//解锁
    return 0;
}UINT WriteB(LPVOID pParam)
{CEdit *pEdit = (CEdit*)pParam;pEdit->SetWindowText(_T("\0"));critical_section.Lock();//临界区资源(g_Array)for (int i = 0; i < 9; i++){g_Array[i] = _T('B');pEdit->SetWindowText(g_Array);Sleep(1000);}critical_section.Unlock();return 0;
}
//按钮启动线程A
void CThreadLockDlg::OnBnClickedWritea()
{// TODO:  在此添加控件通知处理程序代码AfxBeginThread(WriteA, &m_CEditA); //参数表示EDIT控件变量
}//启动线程B
void CThreadLockDlg::OnBnClickedWriteb()
{// TODO:  在此添加控件通知处理程序代码AfxBeginThread(WriteB, &m_CEditB);
}


MFC线程同步—— CCriticalSection类使用相关推荐

  1. MFC(线程同步与异步套接字,孙鑫C++第十六讲笔记整理)

    1.事件对象:来实现线程的同步.与互斥对象一样均属于内核对象.  当人工重置有信号时,所有线程均得到信号,所以不能设为人工重置.代码就不贴了,通过创建匿名的事件对象,也可以让一个程序只能运行一个实例. ...

  2. (二)线程同步_3---在类中使用相互独立的属性同步

    2019独角兽企业重金招聘Python工程师标准>>> 在类中使用相互独立的属性同步 当使用synchronized关键字去同步一个代码块时,我们必须传递一个引用,通常情况下可以使用 ...

  3. C#之:线程同步 Monitor类

    Monitor:提供同步访问对象的机制. 其实lock关键字就是对Monitor的简化调用,lock最终就编译成Monitor,因此一般不不直接用Monitor类 与lock 语句相比较 Monito ...

  4. C#之:线程同步 Mutex类

    Mutex(互斥锁): Mutex: 命名空间:System.Threading 一个同步基元,也可用于进程间同步.是.NET Framework 中提供跨多个线程,或多个进程同步访问的一个类.它非常 ...

  5. MFC(线程同步与异步套接字,孙鑫C++第十六讲笔记整理) - 阿飞的麦克风 - 博客频道...

    http://blog.csdn.net/zh634455283/article/details/7893831

  6. [C# 线程处理系列]专题四:线程同步

    目录: 一.线程同步概述 二.线程同步的使用 三 .总结 一.线程同步概述 前面的文章都是讲创建多线程来实现让我们能够更好的响应应用程序,然而当我们创建了多个线程时,就存在多个线程同时访问一个共享的资 ...

  7. Java多线程详解(线程同步)

    嗨喽-小伙伴们我来了, 上一章,我们通过几个例子(点击跳转)介绍了线程安全问题,而说到线程安全就不得不提到线程同步,它是解决线程安全的一种重要方法.本章就来简单地介绍一下线程同步. 从上一章的学习我们 ...

  8. C#线程(二)线程同步

    一.基本概念 当多个线程同时对一个资源进行操作的时候,便会引发问题,这个时候就需要线程同步,比较典型的就是多线程执行加减操作. 解决方式: 尽可能的重新设计代码逻辑,避免使用线程同步 若必须使用线程同 ...

  9. MFC 多线程及线程同步

    一.MFC对多线程编程的支持 MFC中有两类线程,分别称之为工作者线程和用户界面线程.二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环. 工作者线程没有消息机制,通常 ...

最新文章

  1. mysql innodb表分区
  2. nb移动udp_hwasy-geomagnetism-nbiot
  3. toArray()方法使用说明
  4. 认识JSON绑定:概述系列
  5. 20150303+JQuery选择器-02
  6. sharepoint数据库连接
  7. Python第六次作业
  8. android post 提交数据
  9. android定位坑简书,android webview 定位问题
  10. 7000个源码批量下载
  11. Trace32 加载高通 ramdump
  12. 码农架构 | Spring Boot 实现通用 Auth 认证的 4 种方式
  13. oracle11g64位怎么用sql,PLSQLDeveloper连接Oracle11g64位数据库配置详解(图文)
  14. 秋在季节轮回里,你在思念绽放中
  15. Elastic 与 AWS 和解、英伟达收购 ARM 失败、英特尔加入RISC-V 组织|开源月报 Vol. 03...
  16. linux加新的硬盘,linux添加新硬盘
  17. AutoMapper源码解析
  18. linux下生成ssh密钥并获取密钥
  19. 克服反爬虫机制爬取智联招聘网站
  20. 【CSS】边框圆角的几种用法

热门文章

  1. 大量北美散户打算把补助支票投入股市,80%年轻人开始认可金融交易
  2. lua中的自定义类型:userdata
  3. 基于EasyExcel模板填充方式进行二次导出(动态表头、合并单元格问题处理)
  4. 阿里easyExcel表格样式添加
  5. 沧海一声笑 [怀念黄沾]
  6. 脱胎换骨 WinXP优化精湛10招
  7. matlab相对路径摘抄
  8. 数据库入库的方式实现
  9. .NET 控件集 ComponentOne V2020.0 Update3 发布,正式支持 .NET 5
  10. dhclient 卡死