2012-05-20 6 views
1

Thread1Flag1과 같은 시간에 변경되는 경우 Thread2이 변경되면 Flag1이 변경됩니다. 논리 오류 이외에 다른 문제가 있습니까?스레드 동시 읽기/쓰기

  1. Thread1Thread2 정확한 동시에 Flag1을 읽어 경우는 충돌 등을 일으킬 것인가?
  2. Thread1Flag1에 동시에 쓰고 있습니다. Thread2Flag1입니까?

이들 예에서, Flag1bool이다.

+1

"정확히 같은 시간"이 실제로 무엇을 의미하는지, 그리고 이러한 동작이 디지털 장치에서 어떻게 발생하는지주의 깊게 생각할 수 있습니다. – dmckee

+1

플래그가 인스턴스화되지 않을 수도있는 객체의 속성이 아니면 충돌 자체가 발생하지 않습니다. 하지만 상태 변화를 놓칠 수도 있고 두 스레드에서 같은 상태를 감지 할 수도 있습니다. 그래서 일어날 일은 국가의 변화가 무엇인가에 달려 있습니다. 쓰레드를 안전하게 만드는 것은 안전하지 않은 쓰레기에 대처하는 것보다 훨씬 쉽습니다. –

+0

"_besides logic errors_"당신은 프로그램 로직에 관심이 없으므로 왜 귀찮게합니까? 더 간단한 프로그램은 "hello world"입니다. 당신이하고 싶은 일을하지 않을 수도 있지만 논리 오류에 신경 쓰지 않으면 ... – curiousguy

답변

7

:

  1. Thread1하고 Thread2 정확한 동시에 FLAG1 읽어? 이것은 항상 안전합니다.
  2. Thread1이 Thread1이 플래그 1을 읽는 것과 같은 시간에 Flag1에 쓰고 있습니까? 이것은 데이터 경주입니다.

데이터 경쟁이 정의되지 않은 동작입니다. 정상적인 하드웨어에서는 충돌이 발생하지 않지만 정의되지 않은 동작이므로 아무 일도 발생할 수 없습니다.

+0

누가 C++ 11이라고 말 했나요? –

+3

C++ 03에는 스레딩이 언급되지 않았으므로 ** 아무 것도 ** 작동한다는 보장은 없습니다. C++ 11은 컴파일러와 하드웨어 공급 업체가 합의한 보증을 제공하며 대부분 기존 사례의 공식화를 나타냅니다. 보장되는 것과 그렇지 않은 것에 대한 더 나은 정보원이 있습니까? 그렇다고해서 C++ 11 메모리 모델에 대해서만 대답 할 수는 있습니다. –

+2

@EitanT : 질문에 "C++ multithreading"이라는 태그가 붙어 있습니다. C++ 03에는 "thread"에 대한 개념이 없으므로, 추론을 통해 C++ 11이되어야하며 Jonathan의 대답은 지금까지 유일합니다. 질문자가 특정 플랫폼 스레딩 모델에 대해 알고 싶다면 플랫폼을 식별해야합니다. – Nemo

-1

플래그는 volatile으로 표시되어야합니다. 이렇게하면 컴파일러가 일관성없는 방식으로 읽기/쓰기를 최적화하지 않도록 할 수 있습니다.

나는 bool에 대한 읽기/쓰기가 원자 적이라고 생각합니다. 따라서 액세스 순서에 신경 쓰지 않는다면 다른 문제는 없을 것이라고 생각합니다.

+1

아니요, '휘발성'은 스레딩과 관련이 없으며, 아니요, bool에 대한 액세스는 일반적으로 원자적일 수 있습니다. (일부 하드웨어는 더 강력한 보증을 제공 할 수 있지만 이식성이 없습니다.) 휘발성은 컴파일러가 읽기 및 쓰기를 다시 정렬하는 것을 막아 주지만 하드웨어가 다시 순서를 지정하지 못하게합니다. 올바른 의미를 얻기 위해 원자 유형 또는 원자 조작을 사용하십시오. –

+0

@JonathanWakely 음 .. 미안해, 이해가 안되는데 왜 휘발성 스레드가 스레딩과 관련이 없다고 말하는거야? – Chip

+0

@JonathanWakely - 그는 재주문을 신경 쓰지 않습니다 – Chip

2

내가 아는 한, 2 개의 스레드는 동일한 시간에 동일한 메모리에 액세스 할 수 없습니다.

병렬 컴퓨팅에서도 이러한 가정은 프로세서에서 자동으로 처리됩니다. http://en.wikipedia.org/wiki/Parallel_Random_Access_Machine

그럼 답은 충돌이 아닙니다. 물론 논리 오류가 발생하지만 신경 쓰지는 않으므로 다음과 같이하십시오. p. 는 C++ 11 메모리 모델의 규칙에 따르면

+0

"_2 스레드가 같은 시간에 동일한 메모리에 액세스 할 수 없습니다."_ 공유 메모리는 어떨까요? –

+0

시계 시간에서 같은 시간 의미. 그들은 실제로 메모리를 액세스 할 차례입니다. –

+0

나는 지금 무슨 뜻인지 안다. 그러나 나는 당신의 말씨가 오해의 소지가 있다고 말한다. –

관련 문제