글 수 83
예전에 하이텔 게제동에 올렸던 제 글입니다.
제 목:[참고] 간단히 구현한 스핀락 소스 관련자료:없음 [2410]
보낸이:유영천 (yuchi ) 2001-01-27 19:10 조회:340
DWORD g_dwLockFlag = 0xffffffff;
__asm
{
xor eax,eax
xor edx,edx
lb_enter:
dec eax
lock cmpxchg dword ptr[g_dwLockFlag],edx
jnz lb_enter
// 요기다 동기화가 필요한 코드를 작성
// 이 루틴이 수행되는 동안 다른 스레드가 접근하면 계속 스핀을
// 돌며 진입을 시도하므로 빨리 끝내야한다.
lb_leave:
lock dec dword ptr[dwLockFlag]
}
g_dwLockFlag는 클래스 멤버로 넣어도 상관없고..아무튼 전역으로
잡힌 메모리면 됩니다.
오래 걸리는 코드를 쓸때 이런 스핀락을 사용하면 부하가 무진장
심하므로 빈번하게 호출되고 병목이 자주 걸리는 부분에 사용하면
좋습니다.싱글 cpu에선 별 쓸모가 없고 듀얼 이상에서 빛을 발합니다.
InitializeCriticalSectionAndSpinCount()라는 함수로도 비슷한 효과
를 볼 수 있는데 이것은 스핀락 부분은 떼어서 최대한 작게 만든것입니다.
저 안에서 함수를 호출할거라면 call dword ptr[함수명] 이런식으로
해도될거고 아니면 enter문과 leave문을 함수로 만들어도 되고, 가장
좋은건 안에다 직접 어셈블리로 코딩하는것이죠.
제 목:[참고] 간단히 구현한 스핀락 소스 관련자료:없음 [2410]
보낸이:유영천 (yuchi ) 2001-01-27 19:10 조회:340
DWORD g_dwLockFlag = 0xffffffff;
__asm
{
xor eax,eax
xor edx,edx
lb_enter:
dec eax
lock cmpxchg dword ptr[g_dwLockFlag],edx
jnz lb_enter
// 요기다 동기화가 필요한 코드를 작성
// 이 루틴이 수행되는 동안 다른 스레드가 접근하면 계속 스핀을
// 돌며 진입을 시도하므로 빨리 끝내야한다.
lb_leave:
lock dec dword ptr[dwLockFlag]
}
g_dwLockFlag는 클래스 멤버로 넣어도 상관없고..아무튼 전역으로
잡힌 메모리면 됩니다.
오래 걸리는 코드를 쓸때 이런 스핀락을 사용하면 부하가 무진장
심하므로 빈번하게 호출되고 병목이 자주 걸리는 부분에 사용하면
좋습니다.싱글 cpu에선 별 쓸모가 없고 듀얼 이상에서 빛을 발합니다.
InitializeCriticalSectionAndSpinCount()라는 함수로도 비슷한 효과
를 볼 수 있는데 이것은 스핀락 부분은 떼어서 최대한 작게 만든것입니다.
저 안에서 함수를 호출할거라면 call dword ptr[함수명] 이런식으로
해도될거고 아니면 enter문과 leave문을 함수로 만들어도 되고, 가장
좋은건 안에다 직접 어셈블리로 코딩하는것이죠.