Нужна ли переменная pthread_once_t мьютекс? - PullRequest
3 голосов
/ 02 июня 2011

мы используем Единовременную инициализацию для таких потоков:

/* define a statically initialized pthread_once_t variable */
pthread_once_t once_var = PTHREAD_ONCE_INIT;

/* we call pthread_once function in threads */
int pthread_once(pthread_once_t *once_control, void (*init)(void));

когда несколько потоков собираются изменить состояние переменной pthread_once_t, нужен ли нам мьютекс для ее защиты?

Ответы [ 3 ]

8 голосов
/ 02 июня 2011

Нет, вам не нужен мьютекс для этого. Вызов pthread_once (ссылка здесь ) гарантированно будет выполнен только один раз, даже если несколько потоков пробуют его одновременно.

Это once_var, который защищает вызов от выполнения более одного раза. Он будет работать как положено, при условии, что вы:

  • инициализировать once_var до PTHREAD_ONCE_INIT; и
  • гарантирует, что once_var не имеет автоматической продолжительности хранения (например, в стеке); и
  • все потоки используют одну и ту же переменную once_var.
5 голосов
/ 02 июня 2011

pthread_once является потокобезопасным.В этом случае вы можете рассматривать переменную pthread_once_t как мьютекс.

2 голосов
/ 27 августа 2011

Если бы это было так, весь этот механизм был бы совершенно бесполезен. Что бы вы ни использовали, чтобы гарантировать, что вы только что инициализировали этот мьютекс, можно так же легко сделать то, что вы используете, используя механизм , чтобы сделать один раз.

...