Кто-нибудь знает о полностью потокобезопасной реализации shared_ptr
? Например. ускорение реализации shared_ptr
является потокобезопасным для целей (refcounting), а также безопасно для одновременного чтения экземпляров shared_ptr
, но не для записи или для чтения/записи.
(см. Boost docs, примеры 3, 4 и 5).
Существует ли реализация shared_ptr, которая полностью потокобезопасна для экземпляров shared_ptr
?
Странно, что более высокие документы говорят, что:
Объектыshared_ptr обеспечивают тот же уровень безопасности потоков, что и встроенные типы.
Но если вы сравните обычный указатель (встроенный тип) с smart_ptr
, то одновременная запись обычного указателя будет потокобезопасной, но одновременная запись в smart_ptr
не является.
EDIT: я имею в виду реализацию без блокировки в архитектуре x86.
EDIT2: пример использования для такого умного указателя будет там, где есть число рабочих потоков, которые обновляют глобальный shared_ptr с их текущим рабочим элементом и потоком монитора, который принимает произвольные выборки рабочих элементов. Общий-ptr будет владеть рабочим элементом, пока ему не будет назначен другой указатель рабочего элемента (тем самым уничтожая предыдущий рабочий элемент). Монитор получит право собственности на рабочий элемент (тем самым предотвратит уничтожение рабочего элемента), назначив его собственному shared-ptr. Это можно сделать с помощью XCHG и ручного удаления, но было бы неплохо, если бы shared-ptr мог это сделать.
Другим примером является то, что глобальный shared-ptr содержит "процессор" и назначается некоторым потоком и используется каким-то другим потоком. Когда поток "user" видит, что процессор shard-ptr имеет значение NULL, для его обработки используется альтернативная логика. Если это не NULL, это предотвращает уничтожение процессора, назначая его собственному shared-ptr.