MFC线程同步—— CCriticalSection类使用

MFC线程同步—— CCriticalSection类使用多个线程访问临界区时,可以使用临界区对象。临界区对象是一个独占性共享资源,任一时刻只有一个线程可以拥有临界区。拥有临界区的线程可以访问被保护起来的资源或代码段,其他希望进入临界区的线程将被挂起等待,直到拥有临界区的线程放弃临界区时为止。CCriticalSection类的用法:方法一:(1)定义CCriticalSection类的一个全局对象(以使各个线程均能访问):

大家好,又见面了,我是你们的朋友全栈君。

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

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类使用

   


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/162042.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • SpringBoot使用@Mapper和@MapperScan注解无效的解决方法

    SpringBoot使用@Mapper和@MapperScan注解无效的解决方法在使用@Mapper注解时,注解无效,service层,dao层该添加的注解都添加了,最后发现是少加了一个jar包&amp;lt;!–缺少此jar包,导致@Mapper注解无效–&amp;gt;&amp;lt;dependency&amp;gt;&amp;lt;groupId&amp;gt;org.mybatis.spring.boot&amp;lt;/groupId&amp;gt;

  • vscode新建html文件并快速生成标准的html代码_vscode怎么开始写代码

    vscode新建html文件并快速生成标准的html代码_vscode怎么开始写代码在vscode里新建html文件,总是要一行一行的写标准的html代码;而DW新建html文件,都会自动生成标准的html代码;所以在使用vscode是总觉得很麻烦,  各种百度终于找到了使用的方法(很好用的一个快捷键):步骤:一、先输入一个!      二、点击tab键      三、自动生成标准的html代码(见图)       …

  • 2015 多校联赛 ——HDU5373(模拟)

    2015 多校联赛 ——HDU5373(模拟)

  • .NETMVC 使用过滤器完成未登录拦截[通俗易懂]

    .NETMVC 使用过滤器完成未登录拦截[通俗易懂].NETMVC使用过滤器完成未登录拦截。

  • java老版手机游戏合集激活成功教程

    java老版手机游戏合集激活成功教程一、前言最近刚读完一本书:《Netty、Zookeeper、Redis并发实战》,个人觉得Netty部分是写得很不错的,读完之后又对Netty进行了一波很好的复习(之前用springboot+netty+zookeeper模仿dubbo做rpc框架,那时候是刚学netty后自己造的小轮子)。虽然对于Netty的使用已经比较熟悉了,而且还知道它的底层是基于JavaNIO做进一步的封装,使得并发性能和开发效率得到大大的提升。但是,对于同步阻塞、同步非阻塞、异步这

  • 怎么将sql文件导入数据库_mysql导入sql文件命令

    怎么将sql文件导入数据库_mysql导入sql文件命令打开命令提示符行输入以下命令进入本地数据库2.创建数据库新建一个新数据库用来导入.sql数据3.导入.sql文件在导入.sql文件之前,设置一下编码模式,防止出现中文乱码的情况(第一次导入就出现了中文乱码,所以中添加一步防止出现乱码情况)。以上就是将.sql文件导入数据库的全部操作,这是打开新建的数据库就能看到导入进去的表内容。…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号