Навязчивый список unique_ptrs? - PullRequest
2 голосов
/ 07 октября 2010

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

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

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

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

1 Ответ

1 голос
/ 07 октября 2010

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

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

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


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

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

...