글 수 83
예전에 하이텔 게제동 일반 프로그래밍 게시판에 올렸던 글입니다.
제 목:[참고] 아래 스레드 관련자료:없음 [25853]
보낸이:유영천 (yuchi ) 2001-02-13 14:54 조회:171
cpu가 한개뿐이라도 동시에 리소스를 억세스 할 수 있습니다.
물론 싱글 cpu에선 시분할로 쪼개서 돌리기 때문에 어셈블리
로 멀티스레드를 고려하여 짰다면 상관없겠습니다만, 일반적
으로 고급언어로 프로그래밍하기 때문에 문제가 생깁니다.
다음과 같은 경우를 생각해봅시다.
DWORD a = 0;
DWORD WINAPI thread()
{
a++;
}
스레드 A와 스레드 B가 thread()함수를 동시에 수행한다고 칩시다.
두 스레드가 진입했을때 어떤 일이 생길 수 있을까요?
최적화를 고려하지 않고 가능한 길게 풀어서 어셈으로 구성해봅시다.
1:mov eax,dword ptr[a] ; a++
2:inc eax
3:mov dword ptr[a],eax
멀티 스레드 상황에서 어떤 일이 생길 수 있는 봅시다.
문제없이 돌아가는 경우라면..
스레드 A
mov eax,dword ptr[a]
inc eax
mov dword ptr[a],eax
스레드 B
mov eax,dword ptr[a]
inc eax
mov dword ptr[a],eax
그러나 두 스레드가 어떻게 돌아갈지 모르므로...
이런 경우를 생각할 수 있습니다.
mov eax,dword ptr[a] ; 스레드 A
inc eax ; 스레드 A
mov eax,dword ptr[a] ; 스레드 B
inc eax ; 스레드 B
mov dword ptr[a],eax ; 스레드 B
mov dword ptr[a],eax ; 스레드 A
이러한 경우 스레드 A가 1을 증가시키고는 있으나 스레드 B가 eax에
a변수값을 로드한 시점에선 a값이 0이므로 결과적으로 두 스레드가
a++을 했어도 a는 2가 되지 않고 1이 됩니다.
이걸 확인해보고 싶어서 예전에 100개의 스레드가 100번씩 전역변수
a++을 하게 한적이 있습니다. 결과는 당연히 10000보다 작은 수가
나왔습니다.
멀티 cpu에서라면 어셈블리 명령 하나하나까지도 동시에 수행되므로
동기화 객체를 사용하지 않는 경우는 좀 더 신경을 써야합니다.
제 목:[참고] 아래 스레드 관련자료:없음 [25853]
보낸이:유영천 (yuchi ) 2001-02-13 14:54 조회:171
cpu가 한개뿐이라도 동시에 리소스를 억세스 할 수 있습니다.
물론 싱글 cpu에선 시분할로 쪼개서 돌리기 때문에 어셈블리
로 멀티스레드를 고려하여 짰다면 상관없겠습니다만, 일반적
으로 고급언어로 프로그래밍하기 때문에 문제가 생깁니다.
다음과 같은 경우를 생각해봅시다.
DWORD a = 0;
DWORD WINAPI thread()
{
a++;
}
스레드 A와 스레드 B가 thread()함수를 동시에 수행한다고 칩시다.
두 스레드가 진입했을때 어떤 일이 생길 수 있을까요?
최적화를 고려하지 않고 가능한 길게 풀어서 어셈으로 구성해봅시다.
1:mov eax,dword ptr[a] ; a++
2:inc eax
3:mov dword ptr[a],eax
멀티 스레드 상황에서 어떤 일이 생길 수 있는 봅시다.
문제없이 돌아가는 경우라면..
스레드 A
mov eax,dword ptr[a]
inc eax
mov dword ptr[a],eax
스레드 B
mov eax,dword ptr[a]
inc eax
mov dword ptr[a],eax
그러나 두 스레드가 어떻게 돌아갈지 모르므로...
이런 경우를 생각할 수 있습니다.
mov eax,dword ptr[a] ; 스레드 A
inc eax ; 스레드 A
mov eax,dword ptr[a] ; 스레드 B
inc eax ; 스레드 B
mov dword ptr[a],eax ; 스레드 B
mov dword ptr[a],eax ; 스레드 A
이러한 경우 스레드 A가 1을 증가시키고는 있으나 스레드 B가 eax에
a변수값을 로드한 시점에선 a값이 0이므로 결과적으로 두 스레드가
a++을 했어도 a는 2가 되지 않고 1이 됩니다.
이걸 확인해보고 싶어서 예전에 100개의 스레드가 100번씩 전역변수
a++을 하게 한적이 있습니다. 결과는 당연히 10000보다 작은 수가
나왔습니다.
멀티 cpu에서라면 어셈블리 명령 하나하나까지도 동시에 수행되므로
동기화 객체를 사용하지 않는 경우는 좀 더 신경을 써야합니다.
흠..언제인가 한번쯤은 읽었든 글들인것 같습니다...
수거하셨습니다...