【问题标题】:Initializing an atomic flag in a malloc'd structure在 malloc 结构中初始化原子标志
【发布时间】:2015-07-20 21:20:04
【问题描述】:

我正在尝试在带有 clang 3.6.1 的 FreeBSD 10.1 Release 上的 C 中使用原子,但是当我尝试在 atomic_flag 中的 atomic_flag 变量上使用 ATOMIC_FLAG_INIT 编译程序时,我得到了 @ 987654325@.

这是我要编译的程序。

#include <stdio.h>
#include <stdatomic.h>

struct map
{

    atomic_flag flag;

};

int main(void)
{
    struct map *m = malloc(sizeof(struct map));

    m->flag = ATOMIC_FLAG_INIT;

    free(m);

    return 0;
}

我可以在structs 之外使用atomic_flag,如下例所示,但不能在structs 中使用,那么如何在C structs 中使用原子变量?

#include <stdio.h>
#include <stdatomic.h>

int main(void)
{
    atomic_flag flag = ATOMIC_FLAG_INIT;

    return 0;
}

【问题讨论】:

  • 您知道m 未初始化吗?
  • 是的,但即使初始化结构也会出现相同的编译器错误。
  • 我应该将其标记为“注释”。当然,这并不能解决错误。但是,如果你创建一个自动变量呢?
  • 根据您的使用情况:您可以改用atomic_bool 并使用atomic_init。不确定atomic_flag 是否也允许使用后者。对我来说,atomic_flag 看起来更像是实现所有其他原子类型的基本辅助类型。 IOW:最小公分母。
  • 这不是 FreeBSD 特有的,也不是 clang 特有的。我可以建议将标题更改为更通用一点。像“初始化 malloc 结构中的原子标志”之类的东西?

标签: c struct atomic freebsd c11


【解决方案1】:

atomic_flag 没有可以分配或读取的值,而只有内部状态。

atomic_flag 交互的唯一方法是为其定义的两个函数(如果算上_explicit 版本,则为四个函数)。对于您通过malloc 获取对象的情况,该标志处于“不确定状态”(C11 的 7.17.8 p4)。您可以通过应用两个函数之一简单地将其置于已知状态,即使用atomic_flag_clear 将其设置为“清除”状态,或使用atomic_flag_test_and_set 将其设置为“设置”状态。

在分配 malloc 之后立即使用 atomic_flag_clear 是 相当于使用ATOMIC_FLAG_INIT 初始化变量。

【讨论】:

  • 你能不能说的更彻底一点?
  • 感谢您更新您的答案,当我在malloc 之后尝试atomic_flag_clear 时,它可以工作,但如果我将结构映射为共享内存,它会在atomic_flag_clear 上出现段错误。我正在使用struct map *m = mmap(NULL, sizeof(struct map), PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0);
  • 没关系,我会接受这个,因为你回答了我的问题,最后的评论是第二个问题,所以我会发布第二个问题,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
  • 2014-09-13
  • 1970-01-01
  • 1970-01-01
  • 2015-01-01
  • 1970-01-01
  • 2016-03-20
相关资源
最近更新 更多