2014-10-01 5 views
1

Поскольку в C нет статической инициализации, я хотел бы лениво инициализировать глобальный mtx_t (, пожалуйста, держите ваши рефлексы кляпа). Для меня не проблема использовать логический флаг и еще что-то, но я бы скорее просто проверил переменную mtx_t.есть стандартное состояние mtx_t 'invalid'?

Есть ли благословенное «недопустимое состояние» для mtx_t C11? Я могу проверить переменную на? Я ничего не нашел в черновике.

+0

Я не думаю, что он есть. Потоки C11 широко не применяются, а документация оставляет желать лучшего (в самой спецификации!). Поэтому, если вы не можете найти какой-либо спецификации, то все. –

ответ

3

Нет такого недопустимого состояния, которое вы могли бы проверить, используя неинициализированный mtx_t приводит к неопределенному поведению.

Все, что не имеет статических инициализаторов для mtx_t, немного идиот, на любой нормальной архитектуре вы можете сделать это без проблем. У POSIX есть это.

Кроме того, легко добавить достаточное состояние в mtx_t, чтобы сделать это возможным. Вы должны были бы добавить

  • один volatile int как флаг, который вы установили в единицу при инициализации выполняется
  • один atomic_flag, что вы используете в качестве спин-блокировки в случае первый флаг является 0. В этом случае, как только вы держите спинлока
    • тест флаг инициализации снова
    • , если он по-прежнему 0 инициализировать mtx_t и установить флаг инициализации в один
    • сбросить значение atomic_flag
+0

Это очень четкое описание того, как _not_ реализовать блокировку с двойной проверкой - есть гонка данных на флаге 'volatile int'. – Casey

Смежные вопросы