AFAIK 메모리 장벽 역할을하는 pthread 함수가 있습니다 (예 : clarifications-on-full-memory-barriers-involved-by-pthread-mutexes). 그러나 컴파일 타임 장벽은 컴파일러 (특히 gcc)가 이것을 알고 있습니까? 다른 말로 - 예를 들어. - pthread_create()가 gcc가 재정렬을 수행하지 않는 이유는 무엇입니까?컴파일 시간 장벽 - 컴파일러 코드 재정렬 - gcc 및 pthreads
코드의 예를 들면 다음과 같습니다
a = 1;
pthread_create(...);
그것은 재정렬이 발생하지 것이라고 확신인가?
어떤 다른 기능의 호출에 대한 :
void fun(void) {
pthread_create(...);
...
}
a = 1;
fun();
() 또한 시간의 장벽을 컴파일 재미 (가정에서는 pthread_create()이다)?
다른 번역 단위의 기능은 무엇입니까?
일반적인 gcc 및 pthreads 동작 scpecification에 관심이 있습니다. x86 관련 (다양한 임베디드 플랫폼에 중점을두고 있음) 일 필요는 없습니다.
다른 컴파일러/스레드 라이브러리 동작에도 관심이 없습니다.
변수에 내부 또는 외부 연결 (정적 대 외부)이있는 경우 중요합니까? – Andy
내부 연결 고리가있는 주요 변수는 지역 주민과 유사하게 취급 될 수 있습니다.그러나 간접적으로 외부에 액세스 할 수 있다면 컴파일러는 전역 변수와 유사하게 처리해야합니다. 예를 들어,'static' 변수가 쓰레드 함수에 의해 사용된다면, 쓰레드 함수가 '외부'에서 호출되기 때문에 외부 적으로 간접적으로 접근 할 수 있습니다 (이것은 쓰레드 함수에 대한 포인터가 외부 기능). –
나는 당신의 마지막 코멘트를 얻지 못했다. IMHO 정적 변수는 스레드가 다른 외부 함수 (thread가 생성되기 전에 정적 a에 대한 포인터를 얻음)를 통해 간접적으로 사용될 수 있습니다. 그러나 내가 무엇을 찾고 있는지는 순서 변경이 발생할 수있는 경우 규칙을 설명하는 공식적인 설명 (예 : gcc 문서, 메일 링리스트 게시물 링크)입니다. – Andy