Всегда ли atomic<T *> блокируется?
На моей MAC OS, atomic<T*>
без блокировки.
#include <iostream>
#include <atomic>
int main() {
std::cout << std::atomic<void*>().is_lock_free() << std::endl;
return 0;
}
output: 1
Я хочу знать, если atomic<T*>
всегда свободен замок?
Есть ли ссылка, чтобы ввести это?
3 ответа
Стандарт позволяет реализовать любой атомарный тип (за исключением std::atomic_flag) для реализации с блокировками. Даже если платформа будет разрешать атомизацию без блокировки для некоторого типа, разработчики стандартной библиотеки, возможно, не реализовали бы это.
Если вам нужно реализовать что-то по-другому, когда используются блокировки, это можно проверить во время компиляции, используя ATOMIC_POINTER_LOCK_FREE
макро.
Нет, небезопасно предполагать, что реализация какой-либо конкретной платформы std::atomic
всегда свободен от блокировки
Стандарт определяет некоторые макросы маркеров, в том числе ATOMIC_POINTER_LOCK_FREE
, который указывает, что либо указатели никогда, иногда или всегда не блокируются, для рассматриваемой платформы.
Вы также можете получить ответ от std::atomic<T *>::is_always_lock_free
для вашего конкретного T
, 1
Примечание 1: данный тип указателя должен быть согласованным, поэтому метод экземпляра std::atomic<T *>::is_lock_free()
избыточно
Да, на общих комбинациях аппаратного обеспечения / ОС (Mac/Linux/Win) безопасно предполагать, что указатели могут обрабатываться атомарно без дополнительной блокировки.
Все не страшные реализации C++11 на обычных современных процессорах, таких как PowerPC, x86 и ARM, имеют атомы без блокировки для объектов с шириной как минимум указателя, будь то 32-битный в 32-битном коде или 64-битный в 64-битном битовый код
В общем, делать это предположение небезопасно.