버그 해결을 위한 모든 질문을 던져
+1 vote
154 views
보통 쓰는 방법

int LocalData = InterlockedIncrement(&Data);

 

이때 여기서 로컬로 데이터를 받지않고 Data를 그대로 로직에 사용한다면,

멀티스레딩 환경에서 안전한가요?

 

안전하지못하다면 왜 그런것일까요?

제 생각엔 인터락연산 자체가 CPU에서 atomic을 보장해주는 것이므로, 인터락 연산중에는

다른 코어가 해당 데이터에 접근이 불가능할 것이고

인터락연산이 끝난다음에는 그 즉시 캐시무효화를 선언하므로 데이터가 틀어질일은 없을거같은데...

 

뭔가 놓치고있는 부분이있을까요?
asked (3 point) , 154 views
됩니다.

&Data는 증가할 값의 포인터이기때문에 사용 가능하고, 말씀하신것처럼 내부적으로 mem_fence를 걸기때문에 간섭받지 않습니다.

하지만 InterlockedCompareExchange같은 경우를 보면 반환값을 믿고 쓰도록 되어있고, 다른 Interlocked함수들도 동일하게 반환값을 사용하도록 구현되어 있는데 굳이 일부러 &Data를 사용하여 통일성을 해치면서까지 얻을수 있는 장점이 무엇인지는 잘 모르겠네요.
써먹고자 하는것이 아니라 지금까지 배워왔던 지식의 근간(?)이 흔들리는 느낌이라.. 내부적으로 왜 atomic하지않는지 궁금했습니다

 

어쨌든 Data라는 연산에 원자성을 보장해주고 다른코어에서 문제가 나지않게끔 캐시무효화를 하는데...

캐시무효화가 CPU레지스터를 삭제시키지 않는다? 이건 말이안되는거같고...

그렇다면 이미 다른코어에서 로직을 진행중이었기 때문에 보장되지않는다면 맞는거같은데 확신은없고...

뭐그렇습니다..

아~ 위에 읽어보니 문장에 좀 오류가 있는것 같네요

atomic 원자성하고

lock 접근이 불가능하다

이 두개는 다른의미입니다.

쓰신걸 보면

"CPU에서 atomic을 보장해주는 것이므로, 인터락 연산중에는 다른 코어가 해당 데이터에 접근이 불가능할 것이고"

ㄴ 위 문장에 오류가 있습니다.

mem_fence는 말씀하신 lock의 느낌이 나긴 하지만 그렇게 생각하시면 안될것 같습니다.
 

https://blog.naver.com/bluekms21/222151515616

제가 작성한 Data Race관련 글인데 '원인 분석' 쪽을 읽어보시면 +1하는 동작이 CPU명령어 입장에서 원자적이지 않다는걸 아실수 있을겁니다. 이걸 원자적으로 처리하기 위한 경계이지 다른 스레드의 점유를 막는것과는 다릅니다.

글이 도움이 되신다면 광고한번만 눌러주세요 ㅇ<-< ㅋ
게다가 케시무효화.. 음.. 해당 역할은 Interlocked 계열의 메서드가 한다기보다 volatile 키워드 때문입니다.

해당 키워드는 오히려 최적화에 역행하는 키워드로 자세한 설명은

https://blog.naver.com/bluekms21/222151499805

여기에 적어뒀습니다.
여기저기 물어봐도 속시원한 대답을 듣지못했는데 궁금증이 해결됐습니다!! 감사합니다 블로그광고는 다눌러봤습니다 bb
도움이 되셨다니 다행이네요. 화이팅입니다!

질문에 대한 답변을 하려면 로그인 또는 가입해야합니다.

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

520 질문
675 answers
665 댓글
118,175 users