| 关于多线程同步的几点疑问(以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 |
| ||
| 关于多线程同步的几点疑问(以CRITICAL_SECTION 为例) 好象mutex也可以解决threads之间的同步的,我也不是很懂.真希望有高手能一并指点哦. |
| ||
| 关于多线程同步的几点疑问(以CRITICAL_SECTION 为例) CRITICAL_SECTION 属于轻量级的线程同步对象,相对于mutex来说,它的效率会高很多。mutex可以用于进程之间的同步,CRITICAL_SECTION只在同一个进程有效。 楼主可能对同步机制不是很了解。 我举个例子看看,也许对你有帮助。 全局变量 int num[10]; 线程函数 [code]void setvalue(int var) { for(int i=0;i<10;i++) num[i] = var; } [/code] 如果在两个线程同时调用 setvalue(1) ,setvalue(2),有可能出现在线程一的for i= 5的时候,开始执行线程 2的for()循环。 这时等两个函数都运行结束的时候,全局变量的值就不是你需要的结果了。 如果要解决这个问题,就需要加上CRITICAL_SECTION CRITICAL_SECTION m_sec; InitCrit..... [code]void setvalue(int var) { EnterCriticalSection(&m_sec); for(int i=0;i<10;i++) num[i] = var; LeaveCriticalSection(&m_sec); } [/code] 这时,线程一在执行for里面的循环时,如果windows切换到了线程2运行setvalue()函数,线程2在执行EnterCriticalSection(&m_sec);时就会阻塞,等待线程1执行了Leave时候才会继续执行。 另外,EnterCriticalSection()里面的变量需要是同一个时才会出现互斥。 如果需要分别访问多个互斥资源时,应该定义多个互斥量 |
| ||
| 关于多线程同步的几点疑问(以CRITICAL_SECTION 为例) 1,根据自己实际情况去定 2,如果funa访问了类成员内部的互斥资源,无论A是全局的或者局部的实例,都是有效的。否则 2。1,只有一个全局A的实例时有效。 2。2,无效;需要改成全局的或者static 3,对 4,可以 |
本文通过具体示例探讨了多线程同步中的关键问题,包括何时及如何使用CRITICAL_SECTION进行资源保护,以及如何处理多资源同步等情况。
&spm=1001.2101.3001.5002&articleId=1483426&d=1&t=3&u=6b4f2973a1d84dc2920ee633d8f382f5)
2143

被折叠的 条评论
为什么被折叠?



