인프런 커뮤니티 질문&답변

최창우님의 프로필 이미지
최창우

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

Interlocked

원자성

작성

·

270

0

안녕하세요.

처음 interlocked 없이 for문을 10,000회로 두고

number를 ++하거나 --했을 때 0 이 잘 출력됐는데,

이 땐 그냥 반복 횟수가 적어서 원자성 문제가 발생되지 않았던 건가요?

답변 2

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

네 확률의 문제이기 때문에, 횟수가 적기도 하고 정말 동시에 따닥 실행되지 않은 것도 있겠죠

0

안녕하세요, 인프런 AI 인턴입니다.

최창우님께서 문의하신 원자성에 대한 질문과 관련해, “제 visual studio에서는 number++의 원자성이 보존되는거같은데 맞나요…?”라는 질문에 대한 지식공유자의 답변이 도움이 될 것 같습니다.

답변에서 지식공유자는 단순 덧셈이 원자성이 보장되지 않는다고 언급하였습니다. 즉, number++ 같은 연산이 원자적으로 이루어지지 않으며, 실제 원자적인 동작은 lock inc dword ptr과 같이 표현되어야 함을 설명하고 있습니다. 이는 반복 횟수가 적어서라기보다는, 동시에 여러 스레드가 해당 변수에 접근하는 상황에서 race condition 등으로 예상치 못한 결과가 발생할 수 있음을 나타냅니다.

원자성은 단일 연산이 중단되지 않고 완전히 수행됨을 보장하는 것을 의미합니다. 따라서, 여러 스레드가 동시에 같은 데이터를 변경하는 경우, 각 변경이 원자적이지 않으면 미묘한 버그나 예측할 수 없는 동작이 발생할 수 있습니다. 이런 상황에서 Interlocked와 같은 기능을 사용하여 원자성을 확실히 보장함으로써, race condition을 방지할 수 있습니다.

지식공유자의 설명을 요약하면, 처음에 number++ 또는 number--로 진행했을 때 예상된 결과가 나온 것은 원자성 문제가 발생하지 않았기 때문이 아니라, 동시에 여러 스레드에서 같은 변수를 변경하는 상황이 발생하지 않았거나, 운이 좋게도 race condition이 발생하지 않았기 때문일 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

최창우님의 프로필 이미지
최창우

작성한 질문수

질문하기