关于多线程同步的几点疑问(以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()里面的变量需要是同一个时才会出现互斥。
如果需要分别访问多个互斥资源时,应该定义多个互斥量
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()里面的变量需要是同一个时才会出现互斥。
如果需要分别访问多个互斥资源时,应该定义多个互斥量
相关文章推荐
- 关于多线程同步的几点疑问(以CRITICAL_SECTION 为例)
- 关于CRITICAL_SECTION的问题
- 关于Java equals()方法的几点疑问
- 关于CRITICAL_SECTION、CCriticalSection和信号量的问题
- 关于软件工程的几点疑问
- 关于addview的几点疑问
- 关于csdn博客的几点疑问
- 关于同一线程两次调用EnterCriticalSection的测试
- 关于 windows 互斥锁CRITICAL_SECTION 多次加锁,需要多少释放的问题
- 多线程同步之CRITICAL_SECTION(临界区)
- 关于CRITICAL_SECTION的一些理解
- 关于CRITICAL_SECTION与 CMutex 的看法
- 关于Surf算法的几点疑问
- 关于使用EnterCriticalSection思考
- 关于QT 中 QDialog的几点疑问的解答
- 关于Unicode几点疑问的总结
- 关于Java String对象创建的几点疑问
- 关于request.getRealPath()的几点疑问
- 关于使用博客园后的几点疑问。
- UI设计中关于设计规范、切图和尺寸的几点疑问?