2012-07-29 1 views
10

C++ 11 mutexes lock은 void lock() volatile이 아닙니다. 컴파일러는 어떤 기능이 메모리 장벽인지 알지 못합니다. 휘발성이 아니더라도 모든 기능 장벽이 있습니까? 모든 사람들이 알아야 할 메모리 장벽과 메모리 장벽은 무엇입니까?C++에서 메모리 장벽의 예는 무엇입니까?

+5

정말 플랫폼에 따라 다릅니다. 단일 코어 만있는 임베디드 시스템 용 C++ 컴파일러는 메모리가 항상 일관성이 있기 때문에 어떤 종류의 메모리 장벽 없이도 뮤텍스를 구현할 수 있습니다. –

+1

@BenVoigt, 그들은 여전히 ​​컴파일러 명령 재 배열을 차단해야합니다. –

답변

5

런타임 라이브러리는 컴파일러가 알 수 있도록 뮤텍스를 구현해야합니다! 언어 표준은이 작업을 수행하는 방법에 대해서는 언급하지 않습니다.

아마도, 메모리 베리어로 작동하는 일부 운영 체제 서비스에 대한 호출이 포함됩니다. 또는 컴파일러는 같은 확장자를 가질 수 있습니다. void _ReadWriteBarrier();

5

실제로 std::mutex의 구현은 컴파일러가 잘못된 순서 재 지정을 수행하지 않고 변수로드를 삭제하지 않으며 잠금 변수가 액세스되는지 확인합니다 원자 적으로 CPU가 잠금 획득 및 해제에 필요한 메모리 장벽을 수행한다는 것입니다.

이 작업을 수행하기 위해 수행해야하는 작업의 세부 사항은 플랫폼마다 다르지만 라이브러리 구현은 올바른 작업을 수행 할 것입니다.

+1

제 질문은 컴파일러가 뮤텍스 (mutex)에서 whats를 어떻게 알 수 있으며 왜 잠금 전후에 변수를 다시 정렬하지 않는가? 기능은 분명 휘발성으로 표시되지 않습니다. 또한 MSVC 헤더를 한 번 보았는데 템플릿이 아니라 lib를 통해 링크되어있는 것 같습니다. 그래서 ... 나는 컴파일러가 인라인하여 분석 할 수 있다고 생각하지 않고 재정렬 할 필요가없는 * this * 함수에 vars가 필요한지 확인합니다. –

+0

@ acidzombie24 : 아마도 외부 함수 호출은 컴파일러, 당신이 관찰하기 때문에 이것이 옳은 것으로 입증 될 수는 없다. –