문제

100 바이트로 구성된 구조물이 있다고 가정 해 봅시다. 다음 코드에 대해 어떤 보장을 받았습니까?

m_myLargeStruct = someValue; // copying 100 bytes
Thread.MemoryBarrier();

// Executed by another thread, after "Thread.MemoryBarrier" was called by the first thread
Console.WriteLine(m_myLargeStruct.ToString());

메모리 모델이 메모리 배리어를 배치 한 후 100 바이트 복사가 완료되도록 보장합니까? 아니면 메모리 장벽이 프로세서 아키텍처 크기의 유형에만 적용됩니까? (32 비트의 경우 4 바이트, 8 바이트 ~ 64 비트).
이것이 이유입니다 휘발성 물질 키워드는 원시 유형에만 적용됩니까? (8 바이트 멤버를 휘발성으로 선언하는 경우, 인터 로크 인스턴스가 값을 변경하는 데 사용될 것임을 의미합니다.

나는 충분히 분명했으면 좋겠다 .. :)
감사

도움이 되었습니까?

해결책

분명히 대답은입니다 아니요, 또는 오히려, 당신은 아무것도 보장 할 수 없습니다. 운영 체제가 100 바이트 구조물을 인쇄하는 스레드를 시작하기 전에 100 바이트 구조물에 쓰는 스레드를 교환하는 것을 방지하는 것은 없습니다.

플래그 또는 다른 원자 값을 통해 데이터에 대한 액세스를 조정하려면 메모리 장벽이 사용됩니다. 나는 당신이 정확히 무엇을하려고하는지 알지 못하므로 어떻게 해야하는지에 대한 좋은 예제 코드를 줄 수 없습니다.

다른 팁

읽기 스레드에 메모리 장벽이 없다면 생각한다 많은 도움이 될 것입니다.

개인적으로 나는 부끄러워 할 것이다 :

  • 그렇게 큰 구조
  • 잠금 코드를 작성하기 위해 메모리 모델에 깊이 빠져 들기

... 정말 중요한 이유가 없다면. 이것의 대단히 변이 가능한 데이터로 잠금 코딩을 얻기가 어렵습니다. 전문가조차도 어려움을 겪고 있다고 생각합니다. 나는 일반적으로 "데이터에 액세스하는 모든 블록에 대한 잠금 장치"접근 방식이 올바르게 얻는 것이 더 쉽고 99%의 경우 성능 측면에서는 괜찮습니다.

나는 Microsoft의 PFX 팀이 잠금없이 코딩을 제대로받을 것을 믿으며, 코드를 사용하여 자신의 잠금 무료 프로그램을 비교적 쉽게 작성할 수있는 방법을 제공합니다. 나는 이런 종류의 일을 올바르게 얻는 것을 믿지 않는다. 메모리 장벽을 명시 적으로 사용해야한다면 아마도 너무 열심히 노력하고 있음을 의미합니다.

Writeline 이전의 두 번째 스레드에 또 다른 메모리 장벽이 필요합니다. (시스템이 비대칭 메모리 장벽을 제공하는 경우, 할당 후 릴리스 장벽을 실행하고 Writeline 이전의 획득 장벽을 실행하는 것으로 충분합니다).

데이터 크기는 중요하지 않습니다.

두 장소/스레드 모두에 메모리 장벽이 필요하며 물론 두 번째 스레드의 장벽이 첫 번째 스레드 전에 '실행'되지 않으므로 둘 사이에 동기화가 필요합니다.

구체적으로, 쓰기 스레드에는 '릴리스'메모리 배리어가 필요하며, 읽기 스레드에는 '획득'메모리 배리어가 필요합니다 (기본 플랫폼이 별도의 배리어 의미를 지원하는 경우).

학문적 호기심을 요구하거나 자신의 프레임 워크를 작성하지 않는 한, 라이브러리/프레임 워크/플랫폼에서 동기화 객체 만 사용해야합니다. 이 모든 것을 올바르게 얻으려고 시도하는 것은 까다 롭고 제공된 동기화 객체에서 이미 수행되었습니다.

글쎄, 먼저 당신은 그렇게 큰 구조물이 없어야합니다. 구조물을 사용하는 방법에 대해 매우 조심하지 않는 한 클래스를 사용하는 것보다 느리게됩니다. 또한, 그것은 스트러크의 가치 의미에 반 직관적입니다.

즉, 메모리 장벽은 구조물이 복사되었음을 보장 할 것입니다. 최적화는 장벽을 가로 질러 지침을 움직이지 않습니다.

휘발성 키워드는 약간 다릅니다. 변수에 대한 작업이 최적화되지 않도록 보장하며 메모리 액세스 순서를 보장합니다. 그러나 원자 적으로 액세스 할 수없는 데이터 유형의 경우 여전히 새로운 값의 절반과 이전 값의 절반을 읽을 수 있기 때문에 스레딩 목적으로는 대부분 쓸모가 없습니다.

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