내 머리로는 이해가 안되고

검색도 어떻게 해야할지 한참 고민하다

마땅한게 검색어가 안 떠올라서 질문해 횽들

까놓고 말해서 과제중인데

멀티 스레드 프로그램 중 발생할 문제들 있잖아 

그런 문제에 관한 건데 

과제를 해결하는 과정중에 내 머리로는 동작이 이해가 안되는게 있어서 질문해



일단 슈도코드를 적자면

공유변수=0;
특정한횟수 = 임의의숫자;
메인 스레드()
{
        스레드1 생성
        for(특정한횟수 만큼순회)
        {
                공유변수++;
        }        
        스레드1종료기다림;
        공유변수 출력;
}
스레드1()
{
        for(특정한횟수  만큼순회 )
        {
                공유변수++;
        }        
}

대충 이런데 공유변수의 최종 값이 특정한횟수*1 이상 특정한횟수*2 미만이 되는 상황이 제일 이상적이겠지??
(그니까 실제 코딩상황에서는 공유변수 사용할 때 저런식으로 발생하면 안되겠지만 
 그냥 공유변수를 스레드에서 동시 접근이 일어났을때를 설명하기위한 이상적인 상황을 말하는거야)

그러한 결과를 출력해서 설명하려고 했는데

이해가 정확히 안가는 상황이 뭐냐면

일단
1. 공유변수의 최종값이 특정한횟수*2가 나오는 경우
=> 이건 뭐 어떻게 스레드 1이 실행이 시작되기 전에 메인 스레드 안의 루프가 끝나버리면 되니까 이건 뭐 어느정도 이해
2. 공유변수의 최종값이 특정한횟수*1이 나오는 경우
=> 이 경우가 어떻게 해도 이해가 안돼 

2번 경우는 사실상 특정한 횟수가 1000000번이라고 치면
         전부 더해졌을때 2000000이 나와야 하는 상황에서 1000000이 나왔다는 얘긴데
그럼 각각의 스레드가 각각의 루프를 각각 만회씩 수행을 하는 과정에서 
컨텍스트 스위칭이 정확히 공유변수가 메모리에서 레지스터로 로드되는 시점에만 1000000회가 일어난다는 이야기인데
이게 말이 되나?

근데 웃긴게 여러모로 테스트 해봤는데 특정한 횟수가 1억 이상 넘어가면
그런 현상이 없고, 1000~5000만회 정도면 그런경우가 많이 없는데 그래도 조금 발생하고
1000만회 이하는 매우 자주 발생했고

근데 내가 문득 드는 생각이, 내가 위 코드를 노트북(싱글코어)에서 돌려본거거든
그래서 동일한 컴파일러로 듀얼코어인 PC에서 돌려보면 결과가 다를까? 해서 돌려봤는데 노트북이랑은 달리 특이한 경우는 확 줄어들었고
노트북에서 돌렸을때랑은 달리 노트북에서는 만회정도 돌렸을때는 거의 고정으로 10000, 아님 20000이 나오고
한 단위가 천만이상, 즉 충분히 커야 
십만이상회 가면 적어도 내가 여러본 돌리는 확률정도로는 위에서 말한 특이케이스 안나오더라고. 

당연하다면 당연한 얘기같은데 단일cpu에서는 위의 코드중에 스레드 생성후 스위칭이 안된상태에서 수행을 끝내버려서 그랬겠지;

근데 그렇다 하더라도 2번의 경우는 이해가 잘 안되서..

아 그리고, 그냥 혹시나 증가되는 과정에 문제가 있나 싶어서 노트북으로 테스트할때
개별 변수를 각각의 루프에 부여해서 루프내부에서 증가시킨후에 출력하는 것도 추가시켜봤는데
그런 개별 변수를 넣은 이후에는 또 정상적으로 작동을 하더라고 ㅡ,.ㅡ



아무튼 내가 말을 잘 못씨부려서

안읽은 횽들도 있겠지만

읽어준 횽들 고마웤ㅋ