关于多线程同步的几点疑问(以CRITICAL_SECTION 为例)

本文通过一个全局变量被多个线程同时修改的例子,解释了如何使用CRITICAL_SECTION来确保线程同步,避免数据竞争。文章强调了CRITICAL_SECTION作为轻量级同步机制的重要性,并与mutex进行了对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于多线程同步的几点疑问(以CRITICAL_SECTION 为例)

CRITICAL_SECTION 属于轻量级的线程同步对象,相对于mutex来说,它的效率会高很多。mutex可以用于进程之间的同步,CRITICAL_SECTION只在同一个进程有效。

楼主可能对同步机制不是很了解。
我举个例子看看,也许对你有帮助。

全局变量  int num[10];

线程函数

void  setvalue(int var)
{
      for(int i=0;i<10;i++)
             num[i] = var;
}

如果在两个线程同时调用 setvalue(1) ,setvalue(2),有可能出现在线程一的for i= 5的时候,开始执行线程 2的for()循环。 这时等两个函数都运行结束的时候,全局变量的值就不是你需要的结果了。
如果要解决这个问题,就需要加上CRITICAL_SECTION
CRITICAL_SECTION m_sec;
InitCrit.....

void  setvalue(int var)
{
      EnterCriticalSection(&m_sec);
      for(int i=0;i<10;i++)
             num[i] = var;
      LeaveCriticalSection(&m_sec);
}

这时,线程一在执行for里面的循环时,如果windows切换到了线程2运行setvalue()函数,线程2在执行EnterCriticalSection(&m_sec);时就会阻塞,等待线程1执行了Leave时候才会继续执行。
另外,EnterCriticalSection()里面的变量需要是同一个时才会出现互斥。
如果需要分别访问多个互斥资源时,应该定义多个互斥量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值