문제

이것은 복잡한 질문에 신중하게 고려하십시오기 전에 응답한다.

이것을 사려는 상황이다.두 개의 스레드(독자 및 작가)에 액세스를 하나의 글로벌 int.이 안전합니까?일반적으로,내가 응답하지 않고 생각했다.

그러나,그것을 나에게 보인 허브 서터 그렇게 생각하지 않습니다.에서 자신의 기사에서 효율적인 동시에 그는 설명 흠이 있는 자물쇠-무료 큐수정 버전.

의 끝에 첫 번째 문서 시작의 두 번째는 그에 대해 설명합하지 않는 특성을 고려한 변수,쓰는 순서입니다.Int 의 원자,좋은,그러나 수 없는 반드시 주문할 수 있는 파괴하는 모든 잠금 알고리즘을 포함하는 시나리오.나는 완전히 동의하는 방법 올바른 다중 스레드 동작 모든 플랫폼에서 현재와 미래 사용하 atomics(AKA 메모리 장벽)또는 뮤텍스.

나의 질문;쓰 re-제공하셔야 합니다 지금까지 문제에 실제 하드웨어?거나 다중 스레드 편집증 단지 현학적?
에 대해 무엇을 고전적인 단일 프로세서 시스템의 차이점은 무엇입니까?
무엇에 관한 간단한 RISC 프로세서 같은 임베디드 전원 pc?

설명:내가에 더 관심이 무엇 씨서터에 대해 말 하드웨어(프로세서/캐시)재정렬하는 변수는 씁니다.난 멈출 수 있는 최적화 프로그램에서 깨 코드를 컴파일러 스위치 또는 손 검사는 어셈블리의 후 컴파일할 수도 있습니다.그러나 나는 알고 싶어 하드웨어할 수 있도 엉망으로 만드에서습니다.

도움이 되었습니까?

해결책

당신의 아이디어를 검사하 어셈블리는 충분히 좋지 않다;이 순서에 일어날 수 있는 하드웨어 수준입니다.

당신의 질문에 대답은"이 문제에 읽 하드웨어:" 예! 에서 사실적으로 그 문제 자신입니다.

확인은 문제를 치마로 프로세서 시스템 또는 다른 특별한 경우 상황?내가 주장 때문에"아니오"다섯 살에서 지금이 필요할 수 있습에서 실행하는 멀티 코어 모든 후,그리고 그를 찾는 이러한 모든 위치에 까다로운 일이 될 것입니다(불가능한가?).

하나의 예외:도록 설계된 소프트웨어를 포함 하드웨어 응용 프로그램 참으로 당신은 완전히 통제 하드웨어입니다.사실 내가"사기 같은"이에 그 상황에서 예:팔 프로세서입니다.

다른 팁

Yup-메모리를 사용하는 장벽을 방지하는 명령 순서가 필요합니다.서는 C++컴파일러,휘발성 키워드가 확장되었을 삽입하는 암시 메모리에 대한 장벽마다 읽기 및 쓰기를 하지만 이것은 휴대용 솔루션입니다.(마찬가지 연동*win32Api).Vista 도 추가 어떤 새 보다 세밀하게 연동된 Api 를 지정할 수 있는 읽거나 쓰는 의미입니다.

불행하게도,C++같은 느슨한 메모리 모델는 모든 종류의 코드는 다음과 같이 될 것 휴대용이 아닌 어느 정도는 당신이 쓰기 다른 버전이 서로 다른 플랫폼에 따라 다릅니다.

당신이 말했듯이,때문에 다시 정렬 수행에 캐시 또는 프로세서의 수준을 실제로 할 필요가 일종의 메모리 방벽하도록 적절한 동기화 특히,다중 프로세서(특히 비 86 플랫폼).(나는 주를 믿는 단일 프로세서 시스템에 있지 않는 이러한 문제만을 인용하지 않는 이---나는 확실히 더 기울어 플레이 안전하고 동시 액세스입니다.)

우리가 실행 불구하고,문제에 Itanium 프로세서는 명령을 다시 정렬은 더 적극적인보다 x86/x64.

수정했을 사용하여 연동 명령이 있기 때문이었(시간)방법을 말하는 컴파일러는 단순히 그러나 쓰기 방벽한 후에 할당합니다.

우리가 정말 필요한 언어 확장자를 가진 거래는 이 깨끗.사용 volatile(에 의해 지원되는 경우 컴파일러)도 조악한 세분화된 경우에 당신을 짜내려고 성능의 한 조각의 코드로 가능하다.

이 문제는 실제 하드웨어?

절대적으로 특히,지금으로 이동하는 여러 개의 코어에 대한 현재 및 미래의 Cpu 가 있습니다.경우에 따라 주문 자성 기능을 구현하기 위해 응용 프로그램에서 당신은 할 수 없이 보장 필요조건을 통해 당신의 선택 또는 플랫폼의 사용이 동기화 기본 형식에서 모든 조건,즉고객의 움직임에서 단 하나 중핵 CPU 가 프로그램이 멀티 코어,다음은 있다는 것을 의미합니다,하지만 그 문제가 발생합니다.

에서 인용된 허브 Sutter 문서(두번째)

주문 원자 변수들은 철자가 다른 방법으로서 인기있는 플랫폼 및 환경입니다.예를 들어:

  • volatile C#/.NET,로 volatile int.
  • volatile 또*원자*자바에서와 같이, volatile int, AtomicInteger.
  • atomic<T> 에서는 C++0x,향후 ISO C++에서와 같이 표준 atomic<int>.

나는 보지 못했 어떻게 C++0x 구 원자성 그래서 나는 못할지 여부를 지정하려면 곧 언어 기능은 순수한 라이브러리 구현이나에 의존하고 변화하는 언어도.할 수 있는 제안을 검토할 수 있는지 확인해 보십시오 수로 통합되는 표준이 아닌 확장하여 현재의 공구 체인지 새로운 표준을 사용할 수 있도 사용할 수 있고 이미 당신의 상황입니다.

그것은 문제가 실제 하드웨어입니다.내 친구는 작품을 위한 IBM 고 그의 생활을 주로 sussing 이런 종류의 문제에 고객의 코드입니다.

를 보시려면 얼마나 나쁜 것을 얻을 수 있습 검색에 대한 학문적 논문에 자바 메모리 모형(고 또한 C++메모리 모델).주어진 순서는 실제 하드웨어에 할 수 있는 어떤 것의 안에서 안전은 높은 수준의 언어는 악몽이다.

이 없이 안전하지 않고 있는 실제 하드웨어를 사용할 수 있는 전시 이 문제는,예를 들어 메모리에서 모델을 사용 칩에 xbox360 할 수 있습 쓰는 순서가 변경되는 문제.이것은 악화된 부족에 의해 장벽에 내장,이 문서를 참조하십시오에 msdn 자세한 내용은.

질문에 대한 대답은"안전한"것은 본질적으로 불명확하다.

그것은 항상 안전하고,심지어 복식,는 의미에서 귀하의 컴퓨터를 잡을 수 없는 불.그것은 안전하다는 의미에서 당신은 항상 당신을 얻을 것이 값 int 에서 개최되는 일부 과거의 시간, 안전하지 않다는 의미에서,당신이 얻을 수 있습니다값은/것입 업데이트하여 다른 스레드가 있습니다.

"원"을 얻을 수 있다는 것을 의미한 두 번째 보장합니다.이후 더블 일반적으로지 않은 원자,당신이 얻을 수 있습 32 32 새로운 비트입니다.는 명확하게 안전하지 않습니다.

때 묻는 질문에 가장 관심이 단일 프로세서 사용하기 때문입니다.에서 하나의 댓글 InSciTek Jeff 언 powerpc 동기화 및 ISYNC 다.그 키를 결정적인 대답이다.나는 그것을 발견 에는 IBM 의 사이트입니다.

이 문서는 크고 예쁜 밀도,그러나 멀리이 아니,그것은 안전하지 않습니다.이전 powerpc 의 메모리 최적화되지 충분히 정교한 문제를 유발하는 단일 프로세서에서.그러나,새로운 것들이 훨씬 더 적극적이고 끊을 수 있도 간단한 액세스를 글로벌 int.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top