2012-11-04 2 views
2

나는 다음과 같은 C 코드가 있습니다그런 경우에 light (est) weight GCC 메모리 장벽은 무엇입니까?

... 
data[index] = something; 
a_write_memory_barrier(); 
index = new_index; 
... 

코드는 잠금으로 보호되지 않습니다, 나는 data[index]index의 갱신 전에 저장되어 있는지 확인하려면 (다른 사람들은 dataindex을 읽기). 이 코드를 중심으로 다른 변수에 대한 메모리 쓰기 및 읽기가 있지만 중요하지 않으므로 GCC에서 자유롭게 재정렬 할 수 있습니다. data[index]index의 순서만으로 충분합니다. 이 목표를 달성하기 위해 a_write_memory_barrier()을 어떻게 구현해야합니까?

+1

참조 http://stackoverflow.com/questions/8896092/is-there-a-compiler-memory-barrier-for-a-single-variable – dbrank0

답변

1

주문형 실행 (분산 형 프레임 워크에서 작업 할 가능성이 있음)을 염두에두고 있다면 아키텍처에서 TSO (총점 주문)를 지원하는 경우로드로드, 저장소 및 전체 장벽을 고려해야합니다.)를 사용하면 코드에 쓰여진대로 쓰기 작업이 순차적으로 수행됩니다.

컴파일러 재정렬에 대한 다른 한편으로는 걱정에서 당신은, 휘발성 사용을 생각하면 문제가 해결됩니다 예를 들어 저장소 장벽에서

을 (를 구글), 이러한 장벽의 구현은 건축과에 따라 달라집니다 당신이 사용하는 컴파일러 :

예 :

SPARC 및 GCC 컴파일러

:

#define MEMBAR_STORESTORE() asm volatile ("membar #StoreStore":::"memory") 
+0

제공 한 코드는 주변의 상점 및로드의 순서 재 지정을 막는 메모리 장벽입니다. 나는 단지'index'와'data [index]'의 재정렬을 막기를 원한다. –

+0

@ W.Sun : 코드 – Michael

+0

을 업데이트했습니다. 감사합니다. 그렇다면, 'a = 1; ... (문제의 코드 블록) ... b = 2;', MEMBAR_STORESTORE()도 'a = 1'과 'b = 2'의 순서 변경을 막지 않을까요? 지정된 순서 재 지정을 막는 것이 있습니까? 질문에서, 단지'data [index]'를 쓰고'index'를 쓰는 순서를 유지하면, 그 주위에있는 다른 글들은 재주문 할 수 있습니다. –