gpt4 book ai didi

linux - GLIB:g_atomic_int_get 变成 NO-OP?

转载 作者:太空狗 更新时间:2023-10-29 11:16:23 25 4
gpt4 key购买 nike

在一段较大的代码中,我注意到 glib 中的 g_atomic_* 函数没有达到我的预期,所以我写了这个简单的例子:

#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”选项(预处理后停止)进行编译时,我注意到对 g_atomic_int_get(&foo) 的调用已变为:

(*(&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

最佳答案

您所在的架构不需要内存屏障来进行原子整数设置/获取操作,因此转换是有效的。

这里是它的定义:http://git.gnome.org/browse/glib/tree/glib/gatomic.h#n60

这是一件好事,否则你需要 lock a global mutex对于每个原子操作。

关于linux - GLIB:g_atomic_int_get 变成 NO-OP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5596129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com