临界段CCriticalSection的使用

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

CCriticalSection()

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

CCriticalSection criticalSection;

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

CCriticalSection criticalSection;

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

UINT MessageThread1(LPVOID pParam) 

    criticalSection.Lock(); 
    LPTSTR pMessage = _T("Thread1 is started"); 
    CWnd *pMainWnd = AfxGetMainWnd(); 
    ::MessageBox(pMainWnd->m_hWnd, pMessage, _T("Thread message"), MB_OK); 
    criticalSection.Unlock(); 
    return 0; 

UINT MessageThread2(LPVOID pParam) 

    criticalSection.Lock(); 
    LPTSTR pMessage = _T("Thread2 is started"); 
    CWnd *pMainWnd = AfxGetMainWnd(); 
    ::MessageBox(pMainWnd->m_hWnd, pMessage, _T("Thread message"), MB_OK); 
    criticalSection.Unlock(); 
    return 0; 
}

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

void CThreadTestView::OnLButtonDown(UINT nFlags, CPoint point) 

    AfxBeginThread(MessageThread1, _T("Thread is started")); //启动线程1 
    AfxBeginThread(MessageThread2, _T("Thread is started")); //启动线程2 
    CView::OnLButtonDown(nFlags, point); 
}

执行结果例如以下:

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

时间: 2024-11-05 12:11:49

临界段CCriticalSection的使用的相关文章

RTX临界段,中断锁与任务锁

临界段 代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断.为确保临界段代码的执行不被中断,在进入临界段之前须关中断,而临界段代码执行完毕后,要立即开中断. 由于Cortex-M3/M4的RTX内核库中没有关闭中断的操作,也就是说RTX的源码中不存在临界段. 中断锁 中断锁就是RTOS提供的开关中断函数,因为Cortex-M3/M4的RTX源码中没有关闭中断的操作,所以也就没有提供开关中断函数. 由于RTX没有提供开关中断函数,如果用户自己的应用代码需要开关中断的话怎么办呢?

μC/OS-Ⅲ中的临界段代码

临界段代码(critical sections),也叫临界区(critical region),是指那些必须完整连续运行,不可被打断的代码段.μC/OS-Ⅲ系统中存在大量临界段代码.采用两种方式对临界段代码进行保护:关闭中断.给调度器上锁.两种临界段代码保护功能均通过宏定义实现. 对于中断处理程序和任务都会访问的临界段代码,必须使用管中断的方式进行保护:对于仅由任务访问的临界段代码,可以采用关中断的方式也可以采用给调度器上锁的方式进行保护. 同时,μC/OS-Ⅲ系统还具有测量关闭中断时间.调度器

临界段

其实很简单: 临界段就是不可中断的程序段,比如从UART中读取当前传递回来的值,如果有UART中断,此时这个值又会改变.同样临界段就是保护这类全局变量,如在读取时间节拍时,不应该被时钟更新时钟节拍标志. 实现方法:就是关中断而已. 关中断有3种情况: 1:虽关了中断还是可以有中断产生,那就是临界段本身开了中断?(自己理解是临界段内部自己又打开中断)这种方法不管他,没有用 2:清全局中断标志,这样是临界段完了后中断也是关的,不能回到临界前的状态 3:关全局中断前,保存全局中断标志,临界段后恢复.与

FreeRTOS 临界段和开关中断

临界段代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断.为确保临界段代码的执行不被中断,在进入临界段之前须关中断,而临界段代码执行完毕后,要立即开中断. FreeRTOS 临界段相关知识补充FreeRTOS 的源码中有多处临界段的地方, 临界段虽然保护了关键代码的执行不被打断, 但也会影响系统的实时性.比如此时某个任务正在调用系统 API 函数,而且此时中断正好关闭了,也就是进入到了临界区中,这个时候如果有一个紧急的中断事件被触发,这个中断就不能得到及时执行,必须等到中断开

002_FreeRTOS临界段代码

(一)临界段代码也叫做临界区,是指那些必须完整运行,不能被打断的代码段 (二)FreeRTOS 与 临 界 段 代 码 保 护 有 关 的 函 数 有 4 个,两个是任务级的临界段代码保护,两个是中断级的临界段代码保护 1. 任务级临界段代码保护taskENTER_CRITICAL()和 taskEXIT_CRITICAL()是任务级的临界代码保护,一个是进入临界段,一个是退出临界段,这两个函数成对使用 void taskcritical_test(void) { while(1) { task

MFC线程同步初学笔记

一.事件: CEvent类: 声明在头文件afxmt.h中 根据事件对象发信后是否可以自动恢复未发信状态分为自动事件对象和手动事件对象. 构造函数如下: 1 CEvent( 2 3 BOOL bInitiallyOwn = FALSE, //FALSE未发信,禁止系统启动运行正在等待的线程 4 5 BOOL bManualReset = FALSE, //FALSE时自动发信 6 LPCTSTR lpszNAme = NULL, 7 8 LPSECURITY_ATTRIBUTES lpsaAtt

关键部分CCriticalSection使用

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

过程同步的根本概念:临界资本、同步和互斥

在多道程序情况下,过程是并发履行的,分歧过程之间存在着分歧的互相制约关系.为了调和过程之间的互相制约关系,引入了过程同步的概念. 临界资本 固然多个过程可以共享零碎中的各类资本,但个中很多资本一次只能为一个过程所运用,我们把一次仅许可一个过程运用的资本称为临界资本.很多物理装备都属于临界资本,如打印机等.此外,还有很多变量.数据等都可以被若干过程共享,也属于临界资本.对临界资本的拜访,必需互斥地停止,在每一个过程中,拜访临界资本的那段代码称为临界区.为了包管临界资本的准确运用,可以把临界资本的拜

uC/OS-II测试(TEST)块

/***********************************************************************************************************                                                uC/OS-II*                                          The Real-Time Kernel**