у меня есть struct
он состоит из простых старых данных, которые я разделяю между двумя динамически связанными библиотеками (или общими объектами). (Скомпилировано с C ++ 11).
Один из элементов данных должен быть атомарного типа или, если быть более точным, мне нужно иметь возможность применять префикс ++
а также --
к этому атомарно.
У меня есть проблемы с использованием std::atomic<unsigned int>
для члена, так как я думаю, что две библиотеки будут использовать одну и ту же реализацию STL.
Так что я бы лучше использовал std::uint32_t
в качестве члена и применять атомарные операции к этому члену в библиотеках. Только я не могу понять, как это сделать, кроме использования мьютекса, который может привести к снижению производительности до недопустимого уровня.
В итоге, как я могу сделать что-то вроде
std::int32_t foo;
atomic_increment(foo);
используя функции, доступные по стандарту C ++ 11?
Ты не можешь Стандартный C ++ не учитывает идею разных реализаций библиотеки в разных разделяемых библиотеках (поскольку он не имеет понятия о последних) и поэтому не считает вашу ситуацию существующей. Поэтому нет возможности поддержать его.
На практике, однако, просто используйте std::atomic
— любой достойный компилятор / библиотека на платформе, которая фактически поддерживает атомарность, не должна оставлять никаких следов в машинном коде.