Однопоточный общий указатель для простого включения в большой проект - PullRequest
2 голосов
/ 20 марта 2012

Для написанного мною мультиплатформенного кода на С ++ мне нужен разделяемый указатель.В настоящее время проект не использует надстройку, и его внедрение было бы чрезвычайно сложным или невозможным с точки зрения администрации.Тем не менее, я могу использовать некоторые функции C ++ 11, включая общие указатели.

Существует проблема со стандартными общими указателями, они гарантируют безопасность потоков.Это означает, что на некоторых платформах / компиляторах, таких как GCC (http://tinyurl.com/GCCSharedPtrLockPolicy), атомарные и мьютексы будут использоваться без необходимости, но, по крайней мере, я могу проверить и обойти возникающие при этом проблемы.Тогда для других платформ (http://tinyurl.com/msvscSharedPtr) даже не представляется возможным проверить, какие механизмы безопасности потоков используются.Исходный указатель повышения обеспечивает только самые основные гарантии безопасности потоков (http://tinyurl.com/SharedPtrThreadSafety).

Моя основная проблема заключается в том, что на некоторых платформах Atomics может вызывать дорогостоящие синхронизации между кэш-памятью ЦП, а ненужные мьютексы могут вызыватьзвонки в ОС, которые могут задержаться по не совсем связанным причинам.Этот код будет многопоточным, но у нас есть другие методы синхронизации для перемещения данных между потоками.Потокобезопасный общий указатель просто не нужен или не нужен.

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

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

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

Если есть библиотека с таким простым и достаточно либеральным лицензированием, то я мог бы просто скопировать их код shared_ptr и упроститьМой собственный.

Редактировать: Вычеркнуто что-либо из boost, кроме библиотек только заголовка.Я буду исследовать Локи, как предположил один из ответчиков.Если это не удастся и ответы здесь не материализуются, я брошу свои :(.

Ответы [ 4 ]

4 голосов
/ 20 марта 2012

Я бы посмотрел на один в Локи .Loki значительно меньше, чем boost, а реализация интеллектуальных указателей в Loki легко настраивается.

3 голосов
/ 21 марта 2012

boost shared_ptr поддерживает однопоточное использование

вы можете # определить макрос BOOST_SP_DISABLE_THREADS для всего проекта, чтобы переключиться на обычные обновления неатомарных ссылок

цитата из boost shared_ptr

2 голосов
/ 24 марта 2012

gcc имеет класс __shared_ptr, который принимает политику блокировки.shared_ptr выводит из этого.

Одной из политик является _S_single, которая предназначена для однопоточного кода (то есть: не заблокированный / не атомарный счетчик ссылок)

В C ++ 11 вы можете использовать псевдонимы шаблона, которые будутпозволяют вам использовать нестандартный класс __shared_ptr, который shared_ptr выводит из

template<typename T>
using st_ptr = __shared_ptr<T, __gnu_cxx::_S_single>;

Если у вас еще нет совместимого компилятора, вы можете свернуть свой собственный, просто унаследовав __shared_ptr ипредоставление интерфейса (на самом деле именно так gcc в настоящее время делает это из-за того, что псевдонимы шаблонов не были доступны до 4.7)

Посмотрите в bits/shared_ptr.h, чтобы увидеть, как shared_ptr выводится из __shared_ptr -Это будет тривиально, чтобы бросить свой собственный.

1 голос
/ 26 марта 2012

Вполне возможно написать / адаптировать свой собственный класс интеллектуальных указателей для использования в устаревших проектах, которые не поддерживаются новыми библиотеками. Я написал свою собственную именно по этой причине, и она хорошо работает с MSVC ++ 4.2 и выше.

См. Ootips.org/yonat/4dev/smart-pointers.html, на котором я основываю свою. Определенно возможность, если вы хотите небольшое решение. Требуется только заголовок и файл .cpp.

Ключевым моментом, на который следует обратить внимание, является отсутствие ключевого слова explicit в старых компиляторах. Во-вторых, вы можете разрешить неявное преобразование в необработанный указатель, чтобы ваши API оставались менее затронутыми (мы сделали это), и в этом случае вам следует также позаботиться о том, чтобы предотвратить преобразование в другие типы указателей.

...