终于搞明白了旋转锁是什么东西了。。
2010-03-01 23:02 听雨到天明 阅读(1390) 评论(0) 编辑 收藏 举报以前听说过“互斥旋转锁”这个东西,名字听起来很牛逼啊,让我心生敬仰。夜晚翻书,在windows核心编程里面看到了对这个东西的详细解释,记录在这里。
旋转锁的原型:
//线程之间进行互斥
bool bNoThreadUsing = true;
//旋转互斥锁
void Locker()
{
//以原子操作的方式来进行判断
while (InterlockedExchange((volatile long*)&bNoThreadUsing, TRUE) == TRUE)
{
Sleep(0);
}
/**
在这里写业务逻辑
**/
InterlockedExchange((volatile long*)&bNoThreadUsing, TRUE);
}
虽然InterlockedExchange看起来是原子操作,但是这个比较也有可能插入其他的代码啊
下面是while部分的反汇编代码
while (InterlockedExchange((volatile long*)&bNoThreadUsing, TRUE) == TRUE)
013A13EE mov esi,esp
013A13F0 push 1
013A13F2 push offset bNoThreadUsing (13A7000h)
013A13F7 call dword ptr [__imp__InterlockedExchange@8 (13A819Ch)]
//这个地方是不是有可能另外一个线程也在call dword ptr [__imp__InterlockedExchange@8 (13A819Ch)]?假如那个线程给执行成功了,这个时候,此线程又
//进行了下面这句比较,岂不是让这个线程给得利了?疑惑中
013A13FD cmp esi,esp
013A13FF call @ILT+320(__RTC_CheckEsp) (13A1145h)
013A1404 cmp eax,1
013A1407 jne Locker+4Ch (13A141Ch)