【问题标题】:GLIB: g_atomic_int_get becomes NO-OP?GLIB:g_atomic_int_get 变成 NO-OP?
【发布时间】:2011-08-01 13:17:46
【问题描述】:

在一段较大的代码中,我注意到 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

【问题讨论】:

    标签: linux atomic glib atomic-swap


    【解决方案1】:

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

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

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

    【讨论】:

    • 有趣的是,您是否有任何关于不需要内存屏障这一事实的文档(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”在我的系统上)。我不知道有任何架构是正确的,所以我很想多读一些关于它的内容。
    猜你喜欢
    • 2014-02-22
    • 1970-01-01
    • 2011-07-16
    • 2016-02-12
    • 2013-02-09
    • 2017-04-26
    • 1970-01-01
    • 2012-09-20
    • 2018-12-24
    相关资源
    最近更新 更多