Должен ли std :: atomic <int *> :: load выполнять цикл сравнения и замены?
Резюме: Я ожидал, чтоstd::atomic::load
сstd::memory_order_relaxed
было бы близко к производительности простой загрузки указателя напрямую, по крайней мере, когда загруженное значение редко изменяется. Я видел гораздо худшую производительность для атомарной нагрузки, чем обычная загрузка в Visual Studio C ++ 2012, поэтому я решил исследовать. Оказывается, атомная нагрузка реализована в видесравнения и замены цикл, который я подозреваю, не самая быстрая реализация.
Вопрос: Есть ли какая-то причинаstd::atomic::load
нужно сделать цикл сравнения и обмена?
Фон: Я считаю, что MSVC ++ 2012 выполняет цикл сравнения и замены при атомной загрузке указателя на основе этой тестовой программы:
#include
#include
template
__declspec(noinline) T loadRelaxed(const std::atomic& t) {
return t.load(std::memory_order_relaxed);
}
int main() {
int i = 42;
char c = 42;
std::atomic ptr(&i);
std::atomic integer;
std::atomic character;
std::cout
< *loadRelaxed(ptr) < ' '
< loadRelaxed(integer) < ' '
< loadRelaxed(character) < std::endl;
return 0;
}