Более низкий уровень std::atomic‹unsigned int›

У меня есть struct, состоящий из простых старых данных, которые я разделяю между двумя динамически связанными библиотеками (или общими объектами). (скомпилировано с помощью С++ 11).

Один из элементов данных должен быть атомарным типом или, если быть более точным, мне нужно иметь возможность применять к нему префиксы ++ и -- атомарно.

У меня есть проблемы с использованием std::atomic<unsigned int> для члена, так как я думаю, что это свяжет две библиотеки с использованием одной и той же реализации STL.

Поэтому я бы предпочел использовать std::uint32_t в качестве члена и применить атомарные операции к этому члену в библиотеках. Только я не могу понять, как это сделать, кроме как использовать мьютекс, который ухудшит производительность до неприемлемой степени.

В общем, как я могу сделать что-то вроде

std::int32_t foo;
atomic_increment(foo);

используя функции, доступные по стандарту С++ 11?


person P45 Imminent    schedule 02.10.2014    source источник
comment
Ваш вопрос заключается в том, как что-то решить, когда вы не можете полагаться на стандарт C++ и хотите получить ответ в терминах стандарта C++. Это не имеет смысла.   -  person Kerrek SB    schedule 02.10.2014
comment
Почему бы не реализовать это в разделяемой библиотеке с использованием std::atomic и экспортировать независимый от stl интерфейс?   -  person galinette    schedule 02.10.2014


Ответы (1)


Вы не можете. Стандартный С++ не уважает идею реализации разных библиотек в разных разделяемых библиотеках (поскольку у него нет концепции последнего) и поэтому не считает, что ваша ситуация существует. Поэтому нет возможности его поддерживать.

На практике, однако, просто используйте std::atomic - любой достойный компилятор/библиотека на платформе, которая действительно поддерживает атомарность, не должен оставлять следов в машинном коде.

person Sebastian Redl    schedule 02.10.2014