, 나는 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
재미있는 점은 메모리 장벽이 필요 없다는 문서입니다 (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