Estoy tratando de usar atomics en C en FreeBSD 10.1 Release con clang 3.6.1, sin embargo, cuando intento compilar un programa usando ATOMIC_FLAG_INIT en una variable atomic_flag en una struct , aparece el error: expected expression .
Aquí está el programa que estoy tratando de compilar.
#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; } Puedo usar atomic_flag fuera de las structs como en el ejemplo a continuación, pero no en las structs , entonces, ¿cómo se usan las variables atómicas en las structs C ?
#include <stdio.h> #include <stdatomic.h> int main(void) { atomic_flag flag = ATOMIC_FLAG_INIT; return 0; }atomic_flag no tiene un valor que pueda asignar o leer, sino solo un estado interno.
La única forma de interactuar con atomic_flag son las dos funciones (o cuatro si cuentas las versiones _explicit ) que se definen para él. Para su caso, cuando obtuvo su objeto a través de malloc , la bandera está en un "estado indeterminado" (7.17.8 p4 de C11). Simplemente puede ponerlo en un estado conocido aplicando una de las dos funciones, es decir, usar atomic_flag_clear para configurarlo en el estado "clear", o usar atomic_flag_test_and_set para configurarlo en el estado "set".
Usar atomic_flag_clear justo después de una asignación con malloc es equivalente a inicializar una variable con ATOMIC_FLAG_INIT .