c - 在 malloc 的结构中初始化原子标志

标签 c struct atomic freebsd c11

我正在尝试在带有 clang 3.6.1 的 FreeBSD 10.1 版本上的 C 中使用原子,但是当我尝试在 上使用 ATOMIC_FLAG_INIT 编译程序时struct 中的 >atomic_flag 变量我得到 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;
}

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

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

int main(void)
{
    atomic_flag flag = ATOMIC_FLAG_INIT;

    return 0;
}

最佳答案

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

关于c - 在 malloc 的结构中初始化原子标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31526556/

相关文章:

c - AVR/GNU C 编译器和静态内存分配

c - C中的struct由1个字段组成,是同一类型的字段吗?

c - 我无法弄清楚c中的系统调用 "read"函数。 (K&R c语言书)

C 结构体分配给结构体数组

c# - int 数组使用的内存与只有一个 int 的结构数组使用的内存是等价的吗?

c# - 如何在 C# 中使用索引设置结构的特定成员

C:链接列表和指针到指针

java - Roller 中的 session 安全违规

node.js - 仅当 Redis 中存在 key 时才订阅 channel

java - 直接分配 volatile 变量线程安全吗?和 AtomicReference 一样安全?