Атомность для глобальной переменной, разделяемой потоками - PullRequest
0 голосов
/ 02 июля 2018

Хорошо, тривиальный вопрос. Проблема в том, что каждый ответ, который я нашел здесь, имеет 3/4 противоречивых ответов.

У меня очень простая проблема. У меня есть глобальная переменная с именем ABORT_SIGNAL. На данный момент это объявлено volatile int ABORT_SIGNAL. Я понимаю, что это не делает то, что я хочу ... что ...

У меня есть две темы, которые могут писать в ABORT_SIGNAL. Он начнется с 0 и переместится на 1 через несколько секунд. Все остальные потоки будут регулярно читать эту переменную, проверяя, установлено ли значение 1.

Достигнут ли следующие цели ....

#include <stdint.h>
atomic_int ABORT_SIGNAL;
...

// When updating the value ...
atomic_store(&ABORT_SIGNAL, someValue);

// When reading the value ...
if (atomic_load_explicit(&ABORT_SIGNAL, memory_order_relaxed))
    doSomething()

Другие также предложили мне сделать что-то вроде следующего. После каждой проблемы записи atomic_thread_fence(memory_order_acq_rel); и перед каждой проблемой чтения atomic_thread_fence(memory_order_acq_rel);

1 Ответ

0 голосов
/ 02 июля 2018

Использование расслабленной последовательности не имеет большого смысла, если вы хотите овладеть семантикой.

Но, честно говоря, все это выглядит слишком сложным для небольшого выигрыша.

Просто используйте

_Bool _Atomic flag;

и затем обычные операции, вам не нужно использовать все эти atomic_... псевдофункции. Вы получаете последовательную согласованность с этим.

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

...