Гарантирует ли стандарт C++ 11, что std :: atomic <> реализован как операция без блокировки?
Я на перекрестке, я пытаюсь выбрать между структурой данных на основе блокировки мьютекса и структурой данных без блокировки (и, возможно, без ожидания).
Копаясь немного глубже, я не нашел ни слова о том, поддерживает ли стандарт С++ 11 операции без блокировки для атомарных типов, даже для основанных на ширине интегралов, таких как atomic_uint32_t
. Другими словами, это не просто интерфейс std::atomic<>
который не предоставляется без блокировки; единственное, что выглядит так, как будто во всей стандартной библиотеке предоставлено отсутствие блокировки, - это std::atomic_flag
.
Это правда или я что-то упустил? В чем причина этого? Я имею в виду, что стандарт называет "атомарным" что-то, что явно не блокируется без каких-либо блокировок, и это то, что даже позволяет использовать мьютексы или блокировать вызовы под капотом.
Ответы
Ответ 1
Стандарт C++ не гарантирует, что операции std::atomic<T>
не блокируются. Однако вы можете использовать std::atomic<T>::is_lock_free()
чтобы узнать, std::atomic<T>::is_lock_free()
ли операция std::atomic<T>
29.6.5 [atomics.types.operations.req] параграф 7:
Возвращает: True, если операции с объектами не блокируются, в противном случае - false.
Если он не свободен от блокировки, он все равно будет выполнять необходимую синхронизацию, но для этого будет использоваться некоторая блокировка.
Ответ 2
Если по атомам вы имеете в виду, используя аппаратную поддержку без блокировок, то да, стандарт не дает вам гарантии для этого. Зачем? Ну, потому что разные архитектуры поддерживают различную аппаратную атомарность. std::atomic<>
имеет удобный метод is_lock_free()
, который можно использовать для проверки того, что данный объект фактически заблокирован или использует внутреннюю блокировку для обеспечения атомных операций. Вы можете использовать это и проверить на своем целевом оборудовании, чтобы он был заблокирован или нет, а затем решить, для какой структуры данных идти.
Однако, если говорить, что если целевая архитектура имеет аппаратную поддержку для атомных операций для интегралов фиксированной ширины, которые вас интересуют, и вы не получили свою копию стандартной библиотеки из теневого магазина программного обеспечения в гетто, он, вероятно, будет использовать аппаратное обеспечение вместо полноразмерного блокировки.