您的位置:首页 > 其它

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

2007-01-15 12:56 369 查看
关于多线程同步的几点疑问(以CRITICAL_SECTION 为例)

这个问题小弟看了很多资料,大部分都是比较泛泛的讲一下,没有结合经典例子来讲解的,所以还是没有

彻底的明白,希望大家能指点一下:

1、除了全局变量及文件操作,什么情况下需要用多线程同步?

2、如果定义了类A极其成员函数funcA,假设funcA访问了需要互斥的资源,而且在funcA中用

CRITICAL_SECTION m_CritSect做了EnterCriticalSection(&m_CritSect )及LeaveCriticalSection(

&m_CritSect );等临界区处理,这样,在一个进程中,使用A 的实例有这几种情况:
1)如果在进程里面有全局的A的实例,m_CritSect的作用使多个线程访问funcA是不是应该没有问题的?
2)如果A的实例不是全局的,而是在线程函数中有多个A的实力,是不是funcA中做的CRITICAL_SECTION

临界点就失效了?此时如果将A中m_CritSect改为static是否可以解决这个问题?

3、一个进程中,如果有多个需要同步的资源,比如要两个全局函数写两个个文件, 是不是需要定义两个

CRITICAL_SECTION m_CritSect的变量来分别对其EnterCriticalSection(&m_CritSect)做临界处理?而且

m_CritSect必须要用全局变量??

4、如果多个类的实例同时要访问一个资源,比如要写同一个文件,在类里面定义一个 static

CRITICAL_SECTION m_CritSect,然后在类成员函数Lock用EnterCriticalSection(&m_CritSect )处理线程

同步,是否可行?

    小弟对这个多线程同步的问题比较模糊,不知能否有哪位大狭能让小弟明白其中道理,小弟不胜感激

!!期待中
    如能发几个小demo给我研修一番,感激不尽!先谢谢各位......
    小弟如能搞懂,必将自己所学整理成册让大家受益

   我的mail:netantsflash@163.com
bigapple20082004-11-4 14:01
关于多线程同步的几点疑问(以CRITICAL_SECTION 为例)

好象mutex也可以解决threads之间的同步的,我也不是很懂.真希望有高手能一并指点哦.
Moonwellatg42004-11-5 01:20
关于多线程同步的几点疑问(以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()里面的变量需要是同一个时才会出现互斥。
如果需要分别访问多个互斥资源时,应该定义多个互斥量
Moonwellatg42004-11-5 01:33
关于多线程同步的几点疑问(以CRITICAL_SECTION 为例)

1,根据自己实际情况去定
2,如果funa访问了类成员内部的互斥资源,无论A是全局的或者局部的实例,都是有效的。否则
2。1,只有一个全局A的实例时有效。
2。2,无效;需要改成全局的或者static
3,对
4,可以
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: