Thread1
이 Flag1
과 같은 시간에 변경되는 경우 Thread2
이 변경되면 Flag1
이 변경됩니다. 논리 오류 이외에 다른 문제가 있습니까?스레드 동시 읽기/쓰기
Thread1
및Thread2
정확한 동시에Flag1
을 읽어 경우는 충돌 등을 일으킬 것인가?Thread1
은Flag1
에 동시에 쓰고 있습니다.Thread2
은Flag1
입니까?
이들 예에서, Flag1
은 bool
이다.
Thread1
이 Flag1
과 같은 시간에 변경되는 경우 Thread2
이 변경되면 Flag1
이 변경됩니다. 논리 오류 이외에 다른 문제가 있습니까?스레드 동시 읽기/쓰기
Thread1
및 Thread2
정확한 동시에 Flag1
을 읽어 경우는 충돌 등을 일으킬 것인가?Thread1
은 Flag1
에 동시에 쓰고 있습니다. Thread2
은 Flag1
입니까?이들 예에서, Flag1
은 bool
이다.
:
데이터 경쟁이 정의되지 않은 동작입니다. 정상적인 하드웨어에서는 충돌이 발생하지 않지만 정의되지 않은 동작이므로 아무 일도 발생할 수 없습니다.
누가 C++ 11이라고 말 했나요? –
C++ 03에는 스레딩이 언급되지 않았으므로 ** 아무 것도 ** 작동한다는 보장은 없습니다. C++ 11은 컴파일러와 하드웨어 공급 업체가 합의한 보증을 제공하며 대부분 기존 사례의 공식화를 나타냅니다. 보장되는 것과 그렇지 않은 것에 대한 더 나은 정보원이 있습니까? 그렇다고해서 C++ 11 메모리 모델에 대해서만 대답 할 수는 있습니다. –
@EitanT : 질문에 "C++ multithreading"이라는 태그가 붙어 있습니다. C++ 03에는 "thread"에 대한 개념이 없으므로, 추론을 통해 C++ 11이되어야하며 Jonathan의 대답은 지금까지 유일합니다. 질문자가 특정 플랫폼 스레딩 모델에 대해 알고 싶다면 플랫폼을 식별해야합니다. – Nemo
플래그는 volatile
으로 표시되어야합니다. 이렇게하면 컴파일러가 일관성없는 방식으로 읽기/쓰기를 최적화하지 않도록 할 수 있습니다.
나는 bool에 대한 읽기/쓰기가 원자 적이라고 생각합니다. 따라서 액세스 순서에 신경 쓰지 않는다면 다른 문제는 없을 것이라고 생각합니다.
아니요, '휘발성'은 스레딩과 관련이 없으며, 아니요, bool에 대한 액세스는 일반적으로 원자적일 수 있습니다. (일부 하드웨어는 더 강력한 보증을 제공 할 수 있지만 이식성이 없습니다.) 휘발성은 컴파일러가 읽기 및 쓰기를 다시 정렬하는 것을 막아 주지만 하드웨어가 다시 순서를 지정하지 못하게합니다. 올바른 의미를 얻기 위해 원자 유형 또는 원자 조작을 사용하십시오. –
@JonathanWakely 음 .. 미안해, 이해가 안되는데 왜 휘발성 스레드가 스레딩과 관련이 없다고 말하는거야? – Chip
@JonathanWakely - 그는 재주문을 신경 쓰지 않습니다 – Chip
내가 아는 한, 2 개의 스레드는 동일한 시간에 동일한 메모리에 액세스 할 수 없습니다.
병렬 컴퓨팅에서도 이러한 가정은 프로세서에서 자동으로 처리됩니다. http://en.wikipedia.org/wiki/Parallel_Random_Access_Machine
그럼 답은 충돌이 아닙니다. 물론 논리 오류가 발생하지만 신경 쓰지는 않으므로 다음과 같이하십시오. p. 는 C++ 11 메모리 모델의 규칙에 따르면
"_2 스레드가 같은 시간에 동일한 메모리에 액세스 할 수 없습니다."_ 공유 메모리는 어떨까요? –
시계 시간에서 같은 시간 의미. 그들은 실제로 메모리를 액세스 할 차례입니다. –
나는 지금 무슨 뜻인지 안다. 그러나 나는 당신의 말씨가 오해의 소지가 있다고 말한다. –
"정확히 같은 시간"이 실제로 무엇을 의미하는지, 그리고 이러한 동작이 디지털 장치에서 어떻게 발생하는지주의 깊게 생각할 수 있습니다. – dmckee
플래그가 인스턴스화되지 않을 수도있는 객체의 속성이 아니면 충돌 자체가 발생하지 않습니다. 하지만 상태 변화를 놓칠 수도 있고 두 스레드에서 같은 상태를 감지 할 수도 있습니다. 그래서 일어날 일은 국가의 변화가 무엇인가에 달려 있습니다. 쓰레드를 안전하게 만드는 것은 안전하지 않은 쓰레기에 대처하는 것보다 훨씬 쉽습니다. –
"_besides logic errors_"당신은 프로그램 로직에 관심이 없으므로 왜 귀찮게합니까? 더 간단한 프로그램은 "hello world"입니다. 당신이하고 싶은 일을하지 않을 수도 있지만 논리 오류에 신경 쓰지 않으면 ... – curiousguy