Почему переменная condition_variable не является MoveAssignable

Почему condition_variable не MoveConstructible (согласно http://en.cppreference.com/w/cpp/thread/condition_variable)? Это запрещает включение в много контейнеров (например, std::unordered_map) которые двигают вещи вокруг.

Это заставляет людей использовать unique_ptr который влечет за собой дополнительное выделение кучи, например make_shared были построены, чтобы решить. Также, если у вас нет распределителя пула, это может стать совершенно неэффективным.

1 ответ

condition_variable является структурой синхронизации, которую несколько потоков (потенциально) используют одновременно. (На самом деле, в этом и заключается его цель.) Как вы можете безопасно переместить его? Например, предположим, что он содержит спин-блокировку. Какой-то поток вращается по заданному адресу в адресном пространстве вашего процесса, и вы собираетесь вывести объект из-под него?

Любой вид конструкции синхронизации пользовательского режима не может быть перемещен. То, что выполняет фактическую синхронизацию, требует фиксированного адреса. Вы можете заставить объект выполнять всю свою настоящую работу над объектом, выделенным в куче, который не будет перемещен - и вы идете прямо к косвенной ссылке в кучу, которую вы хотели избежать. (Конструкции синхронизации в режиме ядра могут быть перемещены: у вас есть контроль над некоторыми операционными системами. Но они намного дороже в использовании.)

Их тоже нельзя скопировать - потому что это будет значить?

Просто так должно быть. Ваш дизайн должен учитывать это, вот и все.

(И я не очень понимаю второй абзац вашего вопроса. make_shared был построен, чтобы сделать подсчет ссылок менее дорогим и не иметь никакого отношения к перемещению вещей вокруг. Распределитель пула может улучшать или не улучшать какую-либо конкретную ситуацию, тем более эту, и вы не узнаете, пока не измерите ее.)

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