Навязчивый список unique_ptrs?

У меня есть программа, которая является многопоточной и содержит навязчивый список объектов. Мне нужно передать объекты в этом списке нескольким потокам, но только один поток когда-либо будет владеть объектом за раз, что означает, что мне не нужен этот объект или указатель на него, который будет использоваться совместно.

Я хотел создать навязчивый список с помощью unique_ptr с использованием boost, но из того, что я прочитал, unique_ptr не будет совместим с навязчивой библиотекой Boost, поскольку у нее нет правильной семантики владения.

Для этого навязчивая библиотека требует, чтобы ее элементы (указатели) имели ту же семантику владения, что и необработанный указатель. Таким образом, unique_ptr или даже shared_ptr не подходят.

Я задавался вопросом, может ли кто-нибудь дать мне несколько советов о том, как лучше всего реализовать мой навязчивый список, чтобы я мог безопасно передавать его элементы через несколько потоков и знать, что они перемещаются в этот поток и НЕ разделяются между потоками?

1 ответ

Насколько я понимаю, для того, чтобы это работало, вам понадобятся какие-то хуки для автоотключения.

Поскольку навязчивый контейнер не владеет объектами, которые он содержит, у вас не должно возникнуть проблем с добавлением необработанных указателей, на которые ссылается unique_ptrs, в навязчивый контейнер.

Если вам нужно иметь возможность получить доступ к фактическому unique_ptr из необработанного указателя в навязчивом списке, вам может помочь что-то в духе enable_shared_from_this. (Вам нужно будет объединить свой навязчивый контейнер с навязчивым unique_ptr.)


Подумав немного, кажется, что на самом деле не существует навязчивого варианта unique_ptr, поскольку "навязчивая" часть для интеллектуальных указателей обычно предназначена для подсчета ссылок, а объекты, подобные unique_ptr, не имеют счетчика ссылок.

Вероятно, вам лучше использовать для этого shared_ptr, поскольку он уже имеет enabled_shared_from_this.

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