스레드 생성은 자체적으로 메모리 순서 보장을 제공합니까?


20

나는 대략적으로 이것을하고 싶다 :

초기 실 :

  • 전역 변수에 값을 쓰십시오 (다시 쓰지 않을 것입니다)
    • 이것은 약간 큰 데이터 (배열, 문자열 등) 일 수 있습니다. 단순히 만들 수 없습니다 std::atomic<>.
  • 다른 스레드를 생성

다른 스레드 :

  • 세계 상태를 읽다
  • 일하는 등

이제 인수를 전달할 수 있다는 것을 알고 std::thread있지만이 예제를 통해 C ++의 메모리 보장을 이해하려고합니다.

또한 실제 구현에서 스레드를 만들면 메모리 장벽이 발생하여 스레드가 해당 시점까지 상위 스레드가 작성한 모든 내용을 "볼"수 있다는 확신이 있습니다.

그러나 내 질문은 : 이것이 표준에 의해 보장됩니까?

옆으로 : 나는 약간의 더미를 추가 std::atomic<int>하고 다른 스레드를 시작하기 전에 그 스레드에 쓰고 다른 스레드에서 시작할 때 한 번 읽습니다. 나는 모든 기계류가 이전에 쓰여진 전 세계 상태가 제대로 보이도록 보장 할 것이라고 믿는다.

그러나 내 질문은 이와 같은 것이 기술적으로 필요한지 아니면 스레드 작성으로 충분합니까?


나는 약간의 더미를 추가 할 수 있다고 생각합니다 std::atomic<int>... 사용할 수 있습니다 std::atomic_thread_fence.
린 Kaenbyou

@NathanOliver d' oh. 댓글을 삭제했습니다. 내 질문이 얼마나 어리석은 지에 대해 얼마나 자주 나를 도와 주 었는지 세어 볼 수 없다 ...
idclev 463035818

1
걱정하지 마세요. 그것은 우리 모두에게 일어난다.
NathanOliver

답변:


26

스레드 생성으로 충분합니다. [thread.thread.constr] / 7에 따라 스레드 생성자와 새 스레드 시작 사이에 동기화 지점이 있습니다.

동기화 : 생성자 호출 완료는의 사본 호출 시작과 동기화됩니다 f.

즉, 새 스레드가 생성되기 전에 스레드의 모든 상태가 생성 된 스레드에 표시됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.