关于多线程同步的几点疑问(以CRITICAL_SECTION 为例)
来源:互联网 发布:kindle软件转换txt 编辑:程序博客网 时间:2024/05/18 00:03
关于多线程同步的几点疑问(以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
bigapple2008 2004-11-4 14:01 关于多线程同步的几点疑问(以CRITICAL_SECTION 为例)
好象mutex也可以解决threads之间的同步的,我也不是很懂.真希望有高手能一并指点哦.
Moonwellatg4 2004-11-5 01:20 关于多线程同步的几点疑问(以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()里面的变量需要是同一个时才会出现互斥。
如果需要分别访问多个互斥资源时,应该定义多个互斥量
Moonwellatg4 2004-11-5 01:33 关于多线程同步的几点疑问(以CRITICAL_SECTION 为例)
1,根据自己实际情况去定
2,如果funa访问了类成员内部的互斥资源,无论A是全局的或者局部的实例,都是有效的。否则
2。1,只有一个全局A的实例时有效。
2。2,无效;需要改成全局的或者static
3,对
4,可以
这个问题小弟看了很多资料,大部分都是比较泛泛的讲一下,没有结合经典例子来讲解的,所以还是没有
彻底的明白,希望大家能指点一下:
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
bigapple2008 2004-11-4 14:01 关于多线程同步的几点疑问(以CRITICAL_SECTION 为例)
好象mutex也可以解决threads之间的同步的,我也不是很懂.真希望有高手能一并指点哦.
Moonwellatg4 2004-11-5 01:20 关于多线程同步的几点疑问(以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()里面的变量需要是同一个时才会出现互斥。
如果需要分别访问多个互斥资源时,应该定义多个互斥量
Moonwellatg4 2004-11-5 01:33 关于多线程同步的几点疑问(以CRITICAL_SECTION 为例)
1,根据自己实际情况去定
2,如果funa访问了类成员内部的互斥资源,无论A是全局的或者局部的实例,都是有效的。否则
2。1,只有一个全局A的实例时有效。
2。2,无效;需要改成全局的或者static
3,对
4,可以
- 关于多线程同步的几点疑问(以CRITICAL_SECTION 为例)
- 关于request.getRealPath()的几点疑问
- 关于Unicode几点疑问的总结
- 关于Surf算法的几点疑问
- 关于addview的几点疑问
- 关于csdn博客的几点疑问
- 多线程同步之CRITICAL_SECTION(临界区)
- 关于多线程与CRITICAL_SECTION的使用
- 关于QT 中 QDialog的几点疑问的解答
- 关于QT 中 QDialog的几点疑问的解答
- 关于QT 中 QDialog的几点疑问的解答
- 关于Java equals()方法的几点疑问
- 【C++关键字】关于extern关键字的几点疑问
- 关于多线程的疑问
- 重要的几点疑问
- 进程内多线程同步CRITICAL_SECTION
- 多线程同步-临界区(深入理解CRITICAL_SECTION)
- 关于多线程的几点总结(博客园迁移)
- 线程同步问题,CRITICAL_SECTION和Mutex哪个更快
- 100分求教一个最简单的CRITICAL_SECTION问题
- 数据库恢复
- 找工作
- AJAX世界的先行者
- 关于多线程同步的几点疑问(以CRITICAL_SECTION 为例)
- ASP.NET 2.0服务器控件之复合控件
- 译读 'C++: THE COMPLETE REFERENCE' 开篇
- 触发器的概念及作用
- 开发垂直门户的分布式搜索引擎系统
- 转:IMSS日志中的"WRITE ERROR AT"错误意义
- nutch怎样过滤spam信息。
- 想念我的兄弟
- Java网络编程---I/O部分学习笔记整理