2017-04-03 11 views
0

gliba는 g_atomic_int_get 함수를 제공하여 원자 적으로 C int 유형을 읽습니다. 32 비트 정수를 메모리에서 레지스터로 읽지 않고 프로세서에서 원자 적 연산을 보장하지 않습니다 (예 : mov <reg32>, <mem>)?glib의 g_atomic_int_get의 목적은 무엇입니까?

그렇다면 glib의 g_atomic_int_get 기능의 목적은 무엇입니까?

+1

'프로세서에 의한 원자 적 동작이 보장되지는 않습니까? '글쎄, 프로세서는 무엇입니까? 나는 그것이있는 곳과 그렇지 않은 곳이 있다고 확신합니다. – Siguza

+0

또한 int는 32 비트가 아니며 레지스터도 아닐 수 있습니다. – user3528438

답변

5

일부 프로세서는 정렬되지 않은 데이터를 읽을 수 있지만 한 사이클 이상 걸릴 수 있습니다. 나는. 그것은 더 이상 원자가가 아닙니다. 다른 것들은 원자 연산으로 시작하지 않을 수도 있습니다.

0

x86 mov 명령어는 항상 원자가 아니며, non-atomic if the addresses involved are not naturally aligned입니다.

항상 원자 일지라도 memory barrier이 아니기 때문에 컴파일러는 주변의 다른 명령어를 참조하여 명령어 순서를 자유롭게 변경할 수 있습니다. 프로세서는 런타임시 명령 스트림의 다른 명령을 참조하여 명령을 자유롭게 재정렬 할 수 있습니다.

단일 플랫폼만을 대상으로 코드를 작성하는 경우 (절대 코드를 다른 플랫폼으로 포팅 할 필요가 없다고 확신하는 경우) 절대적인 보장이 필요한 경우 명시 적 원자 적 명령어를 사용해야합니다.