참조로 캐시 유형의 메모리를 읽는 멀티 스레드 프로그램이있는 경우. 예기치 않은 값을 읽는 다른 스레드를 위험에 빠뜨리지 않고 주 스레드로이 포인터를 변경할 수 있습니까?C에서 포인터를 변경하는 것이 원자 적 동작으로 간주됩니까?
변경된 내용이 원자 단위 인 경우 다른 스레드는 이전 값이나 더 새로운 값을 읽습니다. 절대 임의의 메모리 (또는 null 포인터), 맞지?
어쨌든 동기화 방법을 사용해야한다는 것을 알고 있지만 여전히 궁금합니다.
포인터가 원자 적으로 변경됩니까?
업데이트 : 내 플랫폼은 64 비트 리눅스 (2.6.29), 나뿐만 아니라 크로스 플랫폼 대답을하고 싶습니다 있지만 :)
사실, C (또는 C++) 컴파일러가 workDone에 대해 다른 것을 알지 못하면 (예 : 승인되지 않은 "noalias"키워드와 같이) workDone = 1을 앞에 오는 함수 호출 전에 다시 정렬 할 수 있다고 생각하지 않습니다. 반면에, foo = bar; qwerty = uiop; workDone = 1이면 workDone = 1이 움직일 수 있습니다 (또는 workDone이 휘발성이 아닌 경우 일시적으로 레지스터 전용 값이 될 수도 있음). ReceiveResultsOfWork가 qwerty 또는 foo를 보면 workDone이 1인데도 uiop 또는 bar가 표시되지 않을 수 있습니다. DoWork()가 인라인 될 경우 어떤 일이 발생하는지 확인해야합니다. – jesup
컴파일러는 DoWork가 정의 된 방식으로 workDone에 액세스하지 못한다는 것을 입증 할 수 있으면 해당 순서를 변경할 수 있습니다. 이것은 DoWork가 충분히 작고 동일한 번역 단위에서 컴파일러가 인라인으로 결정하면 실제로 발생할 수 있습니다. – derobert
중요한 것은 DoWork() 호출 후에 workDone이 작성되도록 컴파일러가 표준에 구속되지 않는다는 것입니다. 실제로 DoWork()가 실제 함수 호출이라면 컴파일러는 아마 순서를 바꾸지 않을 것입니다. DoWork가 인라인되어 있으면 WorkDone을 DoWork() 이전이나 그 동안 쉽게 다시 정렬 할 수 있습니다. – Michael