Подтвердить что ты не робот

Гарантирует ли стандарт C++ 11, что std :: atomic <> реализован как операция без блокировки?

Я на перекрестке, я пытаюсь выбрать между структурой данных на основе блокировки мьютекса и структурой данных без блокировки (и, возможно, без ожидания).

Копаясь немного глубже, я не нашел ни слова о том, поддерживает ли стандарт С++ 11 операции без блокировки для атомарных типов, даже для основанных на ширине интегралов, таких как atomic_uint32_t. Другими словами, это не просто интерфейс std::atomic<> который не предоставляется без блокировки; единственное, что выглядит так, как будто во всей стандартной библиотеке предоставлено отсутствие блокировки, - это std::atomic_flag.

Это правда или я что-то упустил? В чем причина этого? Я имею в виду, что стандарт называет "атомарным" что-то, что явно не блокируется без каких-либо блокировок, и это то, что даже позволяет использовать мьютексы или блокировать вызовы под капотом.

4b9b3361

Ответ 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(), который можно использовать для проверки того, что данный объект фактически заблокирован или использует внутреннюю блокировку для обеспечения атомных операций. Вы можете использовать это и проверить на своем целевом оборудовании, чтобы он был заблокирован или нет, а затем решить, для какой структуры данных идти.

Однако, если говорить, что если целевая архитектура имеет аппаратную поддержку для атомных операций для интегралов фиксированной ширины, которые вас интересуют, и вы не получили свою копию стандартной библиотеки из теневого магазина программного обеспечения в гетто, он, вероятно, будет использовать аппаратное обеспечение вместо полноразмерного блокировки.