Инициализация флага atomic_flag - PullRequest
5 голосов
/ 02 апреля 2019

У меня есть struct, назовем его struct foo, к которому я хотел бы добавить переменную atomic_flag. До сих пор я calloc использовал структуру, учитывая, что в основном она должна быть инициализирована нулями. Как мне инициализировать atomic_flag член?

struct foo{
    //...
    atomic_flag a_flg;
    //...
};
struct foo *foop = calloc(1,sizeof *foop);
if(!foop) return -1;

//should I be giving up `calloc` (/`malloc`+`memset`) in favor of `malloc`+this?
*foop = (struct foo){ ATOMIC_FLAG_INIT };

Edit:

Я обнаружил, что это связано DR # 421 от Jens Gustedt , в котором предлагается, чтобы нулевая / стандартная инициализация выполнялась только для atomic_flag с. Как я могу узнать, принято ли это?

1 Ответ

4 голосов
/ 02 апреля 2019

Стандарт C11 говорит о 7.17.8p4:

atomic_flag, который явно не инициализирован с ATOMIC_FLAG_INIT, изначально находится в неопределенном состоянии.

И нет никаких указаний на то, что представляет собой тип atomic_flag или его содержимое, поэтому обнуление здесь не поможет.

Вам нужно будет инициализировать его в известное состояние либо с помощью макроса, либо с помощью функций atomic_flag_clear или atomic_flag_clear_explicit.

...