临界段CCriticalSection的使用

摘要:
类似CCriticalSection的对象表示“关键区域”,这是用于同步的对象。同时,只允许一个线程访问资源或代码区域。这可以通过使用CCriticalSection对象控制链接列表来实现。它就像一个键,哪个线程有权执行该线程并阻塞所有其他线程。

CCriticalSection的对象表示一个“临界区”,它是一个用于同步的对象,同一时刻仅仅同意一个线程存取资源或代码区。临界区在控制一次仅仅有一个线程改动数据或其他的控制资源时很实用。比如,在链表中添加一个结点就仅仅同意一次一个线程进行。通过使用CCriticalSection对象来控制链表,就能够达到这个目的。它就像是一把钥匙,哪个线程获得了它就获得了执行线程的权力,而把其他线程统统堵塞。
CCriticalSection类的构造函数原型例如以下:

CCriticalSection()

能够发现这个类的构造函数没有參数,所以创建一个CCriticalSection类的对象很easy,仅仅有例如以下就可以:

CCriticalSectioncriticalSection;

演示样例:使用临界段编写一个有两个线程的应用程序。
1.创建单文档应用程序;
2.在视图类的实现文件里定义一个临界段对象:

CCriticalSectioncriticalSection;

3.在视图类的实现文件里定义两个线程函数:

UINTMessageThread1(LPVOIDpParam)
{
criticalSection.Lock();
LPTSTRpMessage=_T("Thread1isstarted");
CWnd*pMainWnd=AfxGetMainWnd();
::MessageBox(pMainWnd->m_hWnd,pMessage,_T("Threadmessage"),MB_OK);
criticalSection.Unlock();
return0;
}
UINTMessageThread2(LPVOIDpParam)
{
criticalSection.Lock();
LPTSTRpMessage=_T("Thread2isstarted");
CWnd*pMainWnd=AfxGetMainWnd();
::MessageBox(pMainWnd->m_hWnd,pMessage,_T("Threadmessage"),MB_OK);
criticalSection.Unlock();
return0;
}

4.在视图类鼠标左键消息函数编写例如以下:

voidCThreadTestView::OnLButtonDown(UINTnFlags,CPointpoint)
{
AfxBeginThread(MessageThread1,_T("Threadisstarted"));//启动线程1
AfxBeginThread(MessageThread2,_T("Threadisstarted"));//启动线程2
CView::OnLButtonDown(nFlags,point);
}

执行结果例如以下:

临界段CCriticalSection的使用第1张

參考资料:
1.临界段类(CCriticalSection)——MFC http://blog.sina.com.cn/s/blog_627ebfc30100itd9.html
2.《MFC Windows应用程序设计(第2版)》

免责声明:文章转载自《临界段CCriticalSection的使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇框架dubbox的简单使用如何用BlazeDS更改图片下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C# 创建线程的多种方式之Thread类基础知识

1. Thread类创建线程 该类的构造函数可以接受ThreadStart委托参数(定义了无参,返回void的函数),以及ParameterizedThreadStart委托参数(定义了Object参数,返回void的函数)。 static void Main(string[] args) {...

操作系统知识总结

操作系统 面向进程和线程学习操作系统。 目录 Chapter 1 Chapter 2 Chapter 3 Chapter 4 Chapter 5 进程线程模型 进程间通信 同步互斥机制 存储管理 网络I/O模型 内容 进程线程模型 线程和进程的概念已经在操作系统书中被翻来覆去讲了很多遍。很多概念虽然都是套话,但没能理解透其中深意会导致很多内容...

多线程程序写日志时遇到加锁的问题

   前段时间在做项目时,系统是个多线程程序,几个线程都需要写日志,主线程和通讯线程经常在写日志时打架,为了解决这个问题,考虑在写日志的方法中加锁。代码如下:      /// <summary>        /// 写日志时加锁        /// </summary>        private static object...

基于pyqt的电子时钟

基于pyqt的电子时钟 介绍 通过电子时钟完成了基于pyqt的一个综合项目,其中包括UI界面与逻辑代码分离设计的思想,更新界面在主线程中完成,逻辑代码在子线程中完成。子线程的处理结果通过信号发送给主线程进行更新界面。子线程通过继承主线程来访问主线程的共享资源,主线程通过对象方法来访问子线程的资源。涉及多线程和线程休眠与唤醒等功能。 软件架构 操作系统...

springboot配置 Druid , yml格式

datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/mp?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai u...

jvm内存溢出性能调优

常用工具及命令 jps jstat Top jstack jmap mat工具  top -Hp pid可以查看某个进程的线程信息 -H 显示线程信息,-p指定pid jps:可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称及进程pid 如:jps -l pid Jstack命令 jstack是java虚拟机自带的一种堆栈跟踪工具。用于生成java虚...