휘발성으로 문제가 해결됩니다. 시스템의 모든 캐시간에 일관성을 보장합니다. 그러나 각 R 또는 W 액세스에 대한 메모리의 변수를 업데이트하므로 비효율적입니다. 대신 필요할 때마다 메모리 장벽을 사용하여 간단하게 구성 할 수 있습니다. (대부분 PM100 코멘트에 대한) http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html
편집 : 당신이 또는 GCC/ICC 작업하는 경우 동기화 내장 기능에 봐 내가 인용 뭔가를 찾을 수 있도록 내 믿음 참조 아니라는 것을 이해 :)
volatile 키워드는 특정 비동기 이벤트가있을 때 코드가 올바르지 않게 만드는 컴파일러 최적화를 방지하기 위해 고안되었습니다.예를 들어,당신은 컴파일러가 더 흥미 Dr Dobb's
에서 레지스터
에 캐시하는 것이 허용되지 않으며, 원시적 변수가 같은 휘발성 선언하는 경우 :
휘발성 필드 선형화 있습니다. 휘발성 필드를 읽는 것은 잠금을 얻는 것과 같습니다. 작업 메모리가 무효화되고 휘발성 필드의 현재 값이 메모리에서 다시 읽 힙니다. 휘발성 필드를 작성하는 것은 잠금을 해제하는 것과 같습니다. 휘발성 필드는 즉시 메모리에 다시 기록됩니다. (이되지 자성에 대한 모든 일관성에 관한 것입니다) 에서
멀티 프로그래밍의 예술, 모리스 헐리 히 & 니르 쉐빗
잠금은 잠금하지 않는 경우, 당신이해야합니다, 메모리 동기화 코드를 포함 뭔가를하고 휘발성 키워드를 사용하는 것이 아마도 당신이 할 수있는 가장 간단한 일입니다. (메모리가 주소 공간에 묶여있는 외부 장치 용으로 설계되었다고해도, 여기에 요점이 아닙니다.)
출처
2010-02-26 12:22:41
Ben
글이 원자적일 것이라고 생각하는 이유는 무엇입니까? – bmargulies
나는 멀티 스레딩에 대한 전문가가 아니지만, 모든 공유 리소스에 대해 항상 잠금을 구현할 것입니다 ... –
저는 임베디드 PowerPC 싱글 코어 프로세서에서 이런 종류의 작업을 수행했으며 안정적으로 작동합니다. 두 스레드가 쓰기 액세스 권한을 가질 가능성이있는 경우 (예 :'++ sharedInt'와 같은) 읽기 - 수정 - 쓰기 작업을하지 마십시오. (실제로 두 개의 쓰레드가 쓰여질 수 있다면 ** 쓰기가 제한 될 때 ** 유용하다. 예를 들어, 쓰레드 A는 sharedInt를 0에서 1로 바꿀 수있다. 반면 쓰레드 B는 쓰레드 1에서 쓰레드를 변경할 수있다. – Dan