컴파일러가 수행 할 수있는 최적화에 관한 질문이 있습니다.컴파일러 최적화, 스레드 안전?
typedef struct test
{
short i;
} s_test;
int function1(char *bin)
{
s_test foo;
lock(gmutex);
foo.i = *(int*)bin * 8;
unlock(gmutex);
sleep(5);
//
// Here anything can happen to *bin in another thread
// an inline example here could be: *(volatile int *)bin = 42;
//
int b = foo.i + sizeof(char*);
return (b > 1000);
}
컴파일러 이제까지
return ((*(int*)bin * 8 + sizeof(char*)) > 1000);
와 마지막 라인을 대체 할 수 사용하는 경우 될 것 같지 않았다
아래의 코드 (이 예입니다) 자체에 대한 말 것 -O2 또는 -O3를 gcc 4.4와 함께 사용하지만 다른 컴파일러 및 다른 컴파일 플래그의 경우 일 수 있습니까?
표현식으로 변수를 바꾸는 것이 정확히 최적화가 아닙니까? 그렇습니까? – EJP
wrt 컴파일러 최적화 및 스레드 안전성에 대한 내용은 http : // stackoverflow를 참조하십시오.co.kr/questions/2001913/c0x-memory-model-and-speculative-loads-stores 및 특히 그 안에 링크 된 문서를 저장합니다. – janneb
* bin은 gmutex를 가리킬 수있는 _ALL_ 메모리 오브젝트에 대한 모든 액세스를 보호하지 않는 한 뮤텍스 중에 발생할 수 있습니다. 뮤텍스에 의해 보호되는 유일한 것은 로컬 변수 foo인데 당신이 원하지 않았을 수도 있습니다. – slartibartfast