내가 ARM 모르지만, 설명서를 통해 왜곡에서, 다음이 원자 교환 및-추가 대략한다 : 86에 달리
foo:
LDREX R1, [R0] ; R0 is "n", load linked
ADD R2, R1, 1 ; R2 = R1 + 1
STREX R3, R2, [R0] ; store conditionally, R3 = 0 if and only if success
CBNZ R3, foo ; on failure, try again
;; now return R1 to "oldval"
를,이 코드를 임의로 걸릴 수 있다는 것을 나타납니다 성공하기까지는 오랜 시간이 걸리지 만, 결국 이것이 성공할 것이라는 보장이 있는지 확실하지 않습니다.
그러나 조건부 저장소가 필요할 때 정확하게 성공할 것이므로 ARM 방식이 더 안전합니다. 반대로 x86 코드 (커널 스핀 록에서 가져온 것처럼 보입니다)는 *n
에 하나를 추가하고 원래 *n
이 0인지 테스트합니다. 충분한 스레드가이를 동시에 시도하면 잠금을 허용하지 않았더라도 *n
이 오버플로되고 0이 될 수 있습니다.
ARMv6 이상에는 ['LDREX' /'STREX'] (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dht0008a/ch01s02s01.html)가 있으며, 다른 작업으로 인해로드와 저장소 사이에서 참조 된 메모리 위치가 수정되지 않을 때까지 읽기 - 업데이트 - 쓰기 사이클을 시도 할 수 있습니다. – Michael
저는 그것을 실제 응답에 넣었습니다 - 이것이 가장 좋은 방법이라고 들립니다. –
ARM에서 제공하는 일반적인 동기화 개념은 [load-linked/store-conditional]입니다 (http://en.wikipedia.org/wiki/Load-link/store-conditional). –