• 临界段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版)》

  • 相关阅读:
    Centos 环境变量
    Centos 多线程下载工具-axel
    【Sprint3冲刺之前】项目可行性研究报告
    【Sprint3冲刺之前】TDzhushou软件项目测试计划书
    【Sprint3冲刺之前】日历表的事件处理和管理(刘铸辉)
    【Sprint3冲刺之前】项目完成时间表
    【Sprint3冲刺之前】敏捷团队绩效考核(刘铸辉)
    【每日Scrum】第八天(4.29) TD学生助手Sprint2
    【每日Scrum】第七天(4.28)Sprint2总结性会议
    需求分析
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3902837.html
Copyright © 2020-2023  润新知