crossplatform.ru

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

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 килобайт ) Кол-во скачиваний: 421
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
lanz
  опции профиля:
сообщение 16.4.2015, 15:15
Сообщение #2


Старейший участник
****

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

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




Репутация:   8  


1. При такой архитектуре вы можете удалить виджет из другого потока, создав его в одном. Фактически его удалит тот поток, который будет держать последний shared_ptr.

2. Обновлять данные из другого потока на виджете не безопасно. Вы уверенны что не придет событие отрисовки в середине вашего обновления?

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


Студент
*

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

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




Репутация:   0  


Цитата(lanz @ 16.4.2015, 16:15) *
1. При такой архитектуре вы можете удалить виджет из другого потока, создав его в одном. Фактически его удалит тот поток, который будет держать последний shared_ptr.

2. Обновлять данные из другого потока на виджете не безопасно. Вы уверенны что не придет событие отрисовки в середине вашего обновления?

Для многопоточной работы лучше исползуйте систему сообщений. Т.е. другой поток постит сообщение для отображения, а виджет смотрит - есть у него такой потомок или нет. Если нет, ничего страшного, если есть - информация безопасно обновляется. Разделяемые между потоками данные - это большая мина, с которой надо очень аккуратно обходится.


1. ну да.. а что в этом такого?
#include <thread>
int main() {
    int * i = new int(0);
    std::thread th([i](){delete i;});
    th.join();
}


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

мне кажется с очередью сообщений труднее. сейчас у меня виджет содержит данные и мутекс, также функционал от widget_base - слабый казатель на родителя, который и так thread_safe
сообщения они передают клиенту по thradsafe каналу, то есть там мутекс перед тем как оправить данные, так что пользователю каша не придет.


кстати, не понял что-то функционала boost::intrusive_ptr если в конструкторе ему передать (some_raw_pointer, false). это же вызовет ошибку в деструкторе его. или intrusive_ptr_release нужно делать if(counter && --counter == 0) delete p;
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- 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 Рейтинг@Mail.ru Текстовая версия Сейчас: 12.6.2025, 19:58