您的位置:首页 > 其它

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

2008-11-25 17:29 267 查看
关于多线程同步的几点疑问(以CRITICAL_SECTION 为例)

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

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

全局变量  int num[10];

线程函数

[Copy to clipboard] [ - ]CODE: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.....

[Copy to clipboard] [ - ]CODE: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()里面的变量需要是同一个时才会出现互斥。
如果需要分别访问多个互斥资源时,应该定义多个互斥量
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: