crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> weak_ptr from intrusive, свой велосипед
alexy
  опции профиля:
сообщение 15.4.2015, 0:02
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 44
Регистрация: 4.8.2010
Пользователь №: 1931

Спасибо сказали: 0 раз(а)




Репутация:   0  


shared_ptr нельзя создать в конструкторе...
у меня сейчас в многопоточном коде часто появляются двухэтапные конструкторы. снчала создаешь shared_ptr потом вызываешь какой-нибудь registr или еще что-нибудь, куча отложенных созданий объектов, когда я бы мог создать его в конструкторе ,но создаю в фукнции ,которой он нужен, из-за этого появляются дополнительные проверки "не создал ли я его уже?", которых можно было бы избежать, если бы...
к тому же мне не нравится shared_from_this с точки зрения ООП, это как бы деталь реализации, закравшаяся в интерфейс.

может спасти intrusive_ptr, но у него нет weak_ptr и значит проблема циклических ссылок будет.

вобщем сегодня я накатал такой код. не уверен в правильности использвания std::atomic. выбрал shared_ptr для быстроты реализации. потом хочу сделать структуру, одно поле будет счетчиком ссылок для объекта, другое для weak_ptr'а.

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

зы: а что, нельзя загружать файлы hpp ??
Прикрепленные файлы
Прикрепленный файл  intrusive_weak_ptr.hpp.txt ( 3.67 килобайт ) Кол-во скачиваний: 396
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Iron Bug
  опции профиля:
сообщение 16.4.2015, 14:29
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


а зачем делать
auto sptr_ = new foo();
std::shared_ptr<foo> sptr = sptr_->get_shared();


если нужно делать сразу
std::shared_ptr<foo> sptr = shared_ptr<foo>(new foo());


проблема в том, что смешивать обычные указатели и shared_ptr хотя и можно чисто технически, но сильно не рекомендуется. ибо тогда вообще теряется смысл shared_ptr'а.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
alexy
  опции профиля:
сообщение 16.4.2015, 15:04
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 44
Регистрация: 4.8.2010
Пользователь №: 1931

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Iron Bug @ 16.4.2015, 15:29) *
если нужно делать сразу
std::shared_ptr<foo> sptr = shared_ptr<foo>(new foo());


проблема в том, что смешивать обычные указатели и shared_ptr хотя и можно чисто технически, но сильно не рекомендуется. ибо тогда вообще теряется смысл shared_ptr'а.


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


тут проблема в моногопоточности.
например есть какой-то поток, который генерирует очень полезные цифры. он должен показывать их на клиенте (постоянное дуплексное соединение). у него есть слабый казатель на виджет, на какой-нибудь widget::label . когда у него появляется новое число, он берет сильный указатель, проверяет не здох ли виджет (смотри ли этот пользователь или уже закрыл все и свалил) и обновляет данные. в этот момент, пока обновляет, даже если пользователь закроет, виджет никуда не денется, т.к. указатель сильный. потом сильный казатель уходит и вижет может исчезнуть за время, пока его не нужно будет обновлять.

нет, дети не "владеют" родителем. они имееют слабый казатель на родителя. тут такое дело - если родителя прикончат в одном потоке, а другой поток в этот мемент работает с каким-нибудь ребенком и если ему нужно вызвать несколько методов... то у него могут прямо под носом убить объект с которым он работает и мутексы помочь не смогут, так как он берет указатель на объект и..
// плохо, если some_spin - raw pointer
int val = some_spin->value();
// тут другой поток убивает родителя...
if(!do_somthis(val)) some_spin->value(0);

а weak_ptr'а нет, если иметь дело с raw pointer
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- alexy   weak_ptr from intrusive   15.4.2015, 0:02
- - lanz   Цитатаshared_ptr нельзя создать в конструкторе... ...   15.4.2015, 0:53
- - alexy   Цитата(lanz @ 15.4.2015, 1:53) Или чтобы ...   15.4.2015, 14:19
- - lanz   Цитатаа чем лучше? Separation of concerns, разделя...   15.4.2015, 14:58
|- - alexy   Цитата(lanz @ 15.4.2015, 15:58) Separatio...   15.4.2015, 15:48
- - lanz   Цитатаеще проблема с параметрами для инициализации...   15.4.2015, 16:11
- - Iron Bug   может, я не совсем понимаю идею, но чем не устраив...   16.4.2015, 9:17
- - lanz   Цитатаможет, я не совсем понимаю идею, но чем не у...   16.4.2015, 9:33
|- - alexy   Цитата(lanz @ 16.4.2015, 10:33) Просто ес...   16.4.2015, 13:44
- - Iron Bug   один фиг непонятно, чего хотели получить в итоге. ...   16.4.2015, 13:20
- - lanz   shared_ptr подразумевает некую семантику - когда s...   16.4.2015, 14:25
- - Iron Bug   а зачем делать auto sptr_ = new foo(); st...   16.4.2015, 14:29
|- - alexy   Цитата(Iron Bug @ 16.4.2015, 15:29) если ...   16.4.2015, 15:04
- - lanz   1. При такой архитектуре вы можете удалить виджет ...   16.4.2015, 15:15
|- - alexy   Цитата(lanz @ 16.4.2015, 16:15) 1. При та...   16.4.2015, 15:46
- - lanz   Цитата1. ну да.. а что в этом такого? Ничего, если...   16.4.2015, 18:17
- - Iron Bug   обычная схема перерисовки данных - это чтение данн...   17.4.2015, 11:24


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.4.2024, 16:40