自旋锁SPIN LOCK的编程实现
2011-08-19 18:47 心中无码 阅读(1557) 评论(3) 编辑 收藏 举报自旋锁是一种轻量级的互斥量,以达到对共享资源的保护。下面结合代码进行说明。
void
spin_enter(
int* crt
)
{
spin_try:
__asm
{
mov eax, crt
lock bts dword ptr [eax], 0
jz spin_wait
}
return;
__asm
{
spin_wait:
pause
mov eax, spin_var
test eax, 1
jne spin_wait
jmp spin_try
}
}
上面这段代码是关键。*crt初始值为0,lock bts dword ptr[eax], 0是将crt的第0位传递给ZF,同时将crt置为1。同时这条语句是被lock作为前缀的,即这条语句的执行无法并发。执行这条语句后,如果自旋锁此时是空闲的,那么ZF被置为0,反之,ZF被置为1。ZF被置为0时,直接return,否则jz spin_wait,进行wait操作,wait操作是监控crt的值,如果crt的值为1,说明自旋锁仍被占用,循环。否则说明自旋锁此时空闲,跳转到spin_try重新去获取资源。
最后给出所有的代码,包括多线程的测试。
#include <stdio.h>
#include <windows.h>
#include <process.h>
#include <stddef.h>
#include <stdlib.h>
#include <conio.h>
int spin_var = 0;
int count = 0;
/*进入临界区*/
void
spin_enter(
int* crt
)
{
spin_try:
__asm
{
mov eax, crt
lock bts dword ptr [eax], 0
jz spin_wait
}
return;
__asm
{
spin_wait:
pause
mov eax, spin_var
test eax, 1
jne spin_wait
jmp spin_try
}
}
void
spin_leave(
int* crt
)
{
*crt = 0;
}
void thread_fun( void *ch)
{
int id = (int)ch;
while (1)
{
spin_enter(&spin_var);
printf("Thread %d : %d\n", id, count++);
spin_leave(&spin_var);
}
_endthread();
}
void
main(void)
{
int thread_num = 10;
int i;
for (i = 0; i < thread_num; i++)
{
_beginthread(thread_fun, 0, (void *) (i));
}
while (1)
{
Sleep(1000);
}
}
PS.曾传说高铁追尾是调度程序的问题,哥菊花一紧,程序猿除了编码外,又多了一个替罪羊的功能,
天朝V5,还好只是传说…
踏着落叶,追寻着我的梦想。转载请注明出处