나는 std::atomic<>
을 사용하지 않는 것이 좋지 않다는 것을 보여주고 싶지만 실패를 재생산하는 예제를 생성 할 수는 없습니다.멀티 스레딩에서 원자 유형이 필요합니까? (OS X, clang, C++ 11)
{
foobar = false;
}
다른 : 나는 두 개의 스레드가 그 중 하나가하는이
이{
if (foobar) {
// ...
}
}
foobar
의 유형이 중 bool
또는 std::atomic_bool
을 그리고 그것은 true
으로 초기화합니다. 나는 OS X Yosemite를 사용 중이며 this 트릭을 사용하여 스레드가 다른 코어에서 실행되도록하려는 CPU 선호도를 통해 힌트를 표시하려고합니다. 루프 등에서 이러한 작업을 실행하고 어떤 경우에도 실행시 관찰 가능한 차이가 없습니다. 나는 그 소리 clang -std=c++11 -lstdc++ -O3 -S test.cpp
로 생성 된 어셈블리를 검사 결국하지 난 (오른쪽과 왼쪽에 원자없이) 읽기에 ASM의 차이가 작은 것을 볼 :
없음 mfence
또는 뭔가 "극적인"를. 쓰기 측면에서, 뭔가 더 "극적인"발생 : 당신이 볼 수 있듯이
는 atomic<>
버전은 암시 적 잠금을 사용 xchgb
를 사용합니다. 비교적 오래된 버전의 gcc (v4.5.2)를 사용하여 컴파일 할 때 모든 종류의 mfence
이 추가되어 심각한 문제가 있음을 알 수 있습니다.
"X86은 매우 강력한 메모리 모델을 구현합니다"(ref), mfence
은 필요하지 않을 수도 있지만 크로스 플랫폼 코드를 작성하지 않는 한 이해할 수 있습니다. ARM을 지원하기 때문에, ns 레벨에서 일관성을 유지하지 않는다면, 실제로는 atomic<>
을 넣을 필요가 없습니다.
나는 Herb Sutter에서 "atomic<> Weapons"을 지켜 봤지만 여전히 그 문제를 재현하는 간단한 예제를 만드는 것이 얼마나 어려운지에 감명 받았습니다.
당신의 부울은 실제로 여러 스레드에서 액세스 할 수 있습니까? 관련 세부 사항이 누락 된 스 니펫 일뿐만 아니라 전체 예제 프로그램을 제공하는 것이 가장 좋습니다! 또한 gcc 4.5는 다소 오래된 것이지만 최적화 프로그램은 그 이후로 발전해 왔습니다. – hyde
일반적으로 프로그래밍 언어의 규칙은 결코 당신에게 문제를 일으키는 확실한 방법을 제공하지 않습니다. 그것은 다른 방향입니다 : 규칙은 당신에게 문제가없는 * 보장 * 된 프로그램을 만드는 방법만을 제공합니다. –
당신이 원하는 것은 단순히 "서로 다른 스레드가 동기화가없는 동일한 변수/힙 영역을 사용하는 것은 매우 나쁜 생각"이라는 것을 증명하는 것이 아닙니까? 그렇다면 "표준이 아니다 : 원자력은 매우 나쁜 생각이다"라고 번역하지 않는다. – einpoklum