在一个malloc分配的结构体中初始化原子标志

6
我正在尝试在FreeBSD 10.1 Release上使用clang 3.6.1编译器中的C原子操作。但是,当我尝试编译一个使用结构体中的atomic_flag变量及其ATOMIC_FLAG_INIT宏定义的程序时,出现“error:expected expression”的错误提示。
以下是我尝试编译的程序:
#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;
}

我可以像下面的例子那样在结构体外使用atomic_flag,但是在结构体中却不能使用,那么如何在 C 的结构体中使用原子变量呢?
#include <stdio.h>
#include <stdatomic.h>

int main(void)
{
    atomic_flag flag = ATOMIC_FLAG_INIT;

    return 0;
}

你知道 m 没有初始化吗? - too honest for this site
是的,但即使初始化该结构体,您仍会得到相同的编译器错误。 - 2trill2spill
我应该将其标记为“注释”。当然,这并不能解决错误。但是,如果您创建一个自动变量呢? - too honest for this site
根据您的用途:您可能会使用 atomic_bool,并使用 atomic_init。不确定后者是否也允许对 atomic_flag 进行操作。对我来说,atomic_flag 更像是实现所有其他原子类型所需的基本辅助类型。换句话说:是最小公共分母。 - too honest for this site
这不是特定于FreeBSD,也不是特定于clang。我可以建议将标题更改为更通用一些。例如“在malloc的结构中初始化原子标志”? - Henry Gomersall
@Henry Gomersall,是的,你说得对,这样更有意义,我会进行更改。 - 2trill2spill
1个回答

6
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初始化变量。

你能更仔细一点吗? - 2trill2spill
感谢您更新您的答案,当我尝试在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); - 2trill2spill
没关系,我会接受这个答案,因为你回答了我的问题,而最后的评论是第二个问题,所以我会发布第二个问题,谢谢。 - 2trill2spill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接