Всегда ли 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-битном битовый код


В общем, делать это предположение небезопасно.

Другие вопросы по тегам