首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

double check的疑问,该如何处理

2012-02-20 
double check的疑问doublecheck:if(!no_room()){lock()if(!no_room()){use_it()}unlock()}我想问一下,

double check的疑问
double   check:
        if(!no_room()){
                  lock();
                  if(!no_room()){
                          use_it();
                  }
                  unlock();
          }

我想问一下,锁不就是原子的了,锁后不就得到资源了
为什么锁后还要检测一下呢

[解决办法]
多线程系统在代码中任意地方都有可能被打断的
double check:
if(!no_room()){
//.... 如果在这里被打断, 别的线程进行了room操作结果就会不对
lock();
if(!no_room()){
use_it();
}
unlock();
}
[解决办法]
楼上分析的很正确,在多线程中第二个if(!no_room())之前是有可能被改写数据的,可能其它的线程也请求room,而它可能是最后一个了,而现在的线程执行第一个check时是有的(此时其它的线程也在申请,二个线程同时申请),而申请的room很可能刚好是最后一个,那么此时第二个check就非常有必要了。
create_room()
{
.......
double check:
if(!no_room()){ //a,b线程同时申请
lock();//a lock后,b等待
if(!no_room()){//a unlock后,b要再check
use_it();
}
unlock();
}
......

}
当然你也可以把lock放在前面一点,也可以少check一次,要看你具体实现。

热点排行