2011-04-08 3 views
3

, 나는 g_atomic_이 * 입심 함수는 내가 기대했던 일을하지 않은 것으로 나타났습니다, 그래서 나는이 간단한 예제 작성 :GLIB : g_atomic_int_get이 NO-OP가됩니까? 코드의 더 큰 조각에서

#include <stdlib.h> 
#include "glib.h" 
#include "pthread.h" 
#include "stdio.h" 

void *set_foo(void *ptr) { 
    g_atomic_int_set(((int*)ptr), 42); 
    return NULL; 
} 

int main(void) { 
    int foo = 0; 
    pthread_t other; 

    if (pthread_create(&other, NULL, set_foo, &foo)== 0) { 
    pthread_join(other, NULL); 
    printf("Got %d\n", g_atomic_int_get(&foo)); 
    } else { 
    printf("Thread did not run\n"); 
    exit(1); 
    } 
} 

내가 GCC의 '-E'옵션이 컴파일 내가되었다 호출 (& foo는) g_atomic_int_get 것을 고지 (전처리 후 중지)

(*(&foo)) 

및 g_atomic_int_set() (INT (*) PTR, 42)가있다 :

((void) (*(((int*)ptr)) = (42))) 

분명히 단순한 (스레드가 안전하지 않은) 할당뿐만 아니라 일부 원자 비교 및 ​​스왑 조작을 기대하고있었습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 당신은에있는

gcc -m64 -E -o foo.E `pkg-config --cflags glib-2.0` -O0 -g foo.c 

답변

2

아키텍처는/원자 정수 세트에 대한 메모리 장벽을 요구하는 작업을하지 않기 때문에 변환이 유효합니다 : 명령을 컴파일 나의 레퍼런스를 들어

은 다음과 같습니다.

여기가 정의되어 어디 : 그렇지 않으면 당신은 모든 원자 작업에 lock a global mutex에 필요할 것 때문에 http://git.gnome.org/browse/glib/tree/glib/gatomic.h#n60

이, 좋은 일이있다.

+1

재미있는 점은 메모리 장벽이 필요 없다는 문서입니다 (uname -a는 "Linux rhel-5.4-dev 2.6.18-164.15.1.el5xen # 1 SMP Mon Mar 1 11:11 : 42 EST 2010 x86_64 x86_64 x86_64 GNU/Linux ")를 설치하십시오. 이것이 사실 인 아키텍처가 있다는 것을 알지 못했기 때문에 그것에 대해 더 많이 읽고 싶습니다. – laslowh