Использование атомарной переменной в потоках

c++ multithreading atomic stdatomic

479 просмотра

1 ответ

Рассмотрим программу с тремя потоками A, B, C.

У них есть общий глобальный объект G.

Я хочу использовать атомарную переменную (i) внутри G, которая написана потоком B и прочитана A.

Мой подход был:

объявить я в G как:

std::atomic<int> i;

запишите его из потока B, используя указатель на G как:

G* pG; //this is available inside A and B 

pG->i = 23;

И прочитайте это из темы A, используя тот же способ.

int k = pG->i;

Правильный ли мой подход, если эти потоки пытаются получить доступ к этой переменной одновременно.?

Автор: Pasan W. Источник Размещён: 08.11.2019 10:59

Ответы (1)


4 плюса

Решение

Как говорит СП, все зависит от того, какое у вас определение «правильный». См. Http://preshing.com/20120612/an-introduction-to-lock-free-programming/ . Если ему не нужно синхронизироваться с чем-либо, вы должны использовать std::memory_order_relaxedхранилища вместо последовательных хранилищ согласованности по умолчанию, чтобы они компилировались в более эффективный asm (без инструкций барьера памяти).

Но да, доступ к элементарному элементу структуры через указатель - это нормально, если сам указатель инициализируется до запуска потоков.

Если структура является глобальной, то не используйте указатель на нее, просто обращайтесь к глобальной напрямую. Наличие отдельной переменной, которая всегда указывает на один и тот же глобал, является дополнительным уровнем косвенности без какой-либо выгоды.

Если вы хотите изменить указатель, он тоже должен быть std::atomic<struct foo *> pG, и его изменение усложняется тем, что вы решаете, когда безопасно освободить старые данные после их изменения.

Автор: Peter Cordes Размещён: 20.08.2016 07:23
Вопросы из категории :
32x32