intel의 프로세서 설명서 : 섹션 8.2.3.4의 link로드는 다른 위치의 이전 저장소와 다시 정렬 될 수 있지만 동일한 위치의 이전 저장소와 정렬되지 않을 수 있습니다.메모리 순서 재 지정 : 이전의 상점으로 다른 순서로로드 순서를 재조정 할 수 있습니까?
그래서 나는 다음과 같은 두 가지 작업을 다시 정렬 할 수 있다는 것을 이해 :
x = 1;
y = z;
그리고 다음과 같은 두 가지 작업을 다시 정렬 할 수없는
:x = 1;
y = x;
그러나이 발생하면 저장 및로드 위치는 다르지만 부하가 상점을 완전히 포함합니다. 예 :
typedef union {
uint64_t shared_var;
uint32_t individual_var[2];
} my_union_t;
my_union_t var;
var.shared_var = 0;
var.individual_var[1] = 1;
int y = var.shared_var;
이 경우 'y'는 0이 될 수 있습니까?
EDIT (@Hans Passant)이 기술을 사용하여 잠긴 지침을 사용하지 않고 스레드 간 준 동기화를 고안 할 수 있는지 더 자세히 설명하려고합니다.
스레드 1 :
var.individual_var[0] = 1;
int y = __builtin_popcountl(var.shared_var);
스레드 2 :
my_union_t var;
var.shared_var = 0;
그리고 두 개의 스레드가 다음 코드를 실행 :
그래서 더 구체적인 질문은 전역 변수를 주어var.individual_var[1] = 1;
int y = __builtin_popcountl(var.shared_var);
두 스레드 모두에서 'y'를 1로 설정할 수 있습니까?
참고 : __builtin_popcountl은 변수에 설정된 비트 수를 계산하기위한 내장형 gcc 내장 함수입니다.
주문은 여러 코어가 메모리 위치를 액세스 할 때만 역할을합니다. 귀하의 발췌 문장에서 보이지 않는, 게시 된 코드는 결코 실패 할 수 없습니다. 여러 스레드가 동기화없이 동일한 메모리 위치를 읽고 쓰는 것은 실용적이지 않습니다. –
C의 일관성 및 순서 문제에 대해 생각해 보면 컴파일러 자체에서 가능한 문구 작성 및 최적화로 인해 문제가 복잡해집니다. 예를 들어, 컴파일러에게 유니온이 휘발성이라고 알려주지 않았기 때문에 두 개의 스레드 예제가 깨질 수 있습니다. – srking