Russian Qt Forum
Ноябрь 22, 2024, 13:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 3 [4] 5 6 ... 9   Вниз
  Печать  
Автор Тема: C++ Object Token Library  (Прочитано 58925 раз)
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #45 : Февраль 10, 2020, 11:59 »

Используйте конкретный термин "not thread-safe" - ведь именно его Вы имели ввиду.
Даже если бы это и было так, это не может быть основанием "невозможности", просто пишем что данный класс/фича "not thread-safe",
и спокойно ее юзаем.
Да, если дело дойдет до multi-threading - придется прилагать усилия, лочить и.т.п.
Но это обычная работа которую приходится делать во многих случаях, нередко и с "продленным" weak.

для однопоточного случая используй обычный голый указатель - никакой разницы.

Эту песню я слышал много раз.
Голые указатели = плохо. Давайте сделаем все указатели вумными! И будет счастье!
Ну а поскольку возможности юника на практическом нуле - остается делать все shared.
Вас не смущает что это чисто ход мысли начинающего?
Что давать такие советы не требует никакого (ну совсем никакого) ума?
Вы сами-то пробовали так делать? И что, хорошо получилось?
Может лучше поменять взад на голые?  Улыбающийся

ты вообще понимаешь зачем нужны умные указатели?
если умный указатель не даёт никаких приимуществ по сравнению с обычным сырым указателем,
то нахера он нужен?

Да, и чисто технически "продлить юник" несложно. Причем используя совершенно легальные средства предоставляемые std.
Несколькими постами выше ViTech кинул ссылочку, интересно - почитаете.

остановок "туда" и "здеся" не существует.
существуют только конкретные остановки.
и конкретные ссылки.




Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #46 : Февраль 10, 2020, 12:02 »

И где тут "weak становится expired, когда unique помирает"?

зачем он нужен?

Быстро же вы ответы изменяете )).

Я так понял: "зачем ... нужен?" - это ваш коронный вопрос. А зачем нужен std::weak_ptr::expired()?
Записан

Пока сам не сделаешь...
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #47 : Февраль 10, 2020, 12:19 »

Быстро же вы ответы изменяете )).

я пришел к выводу, что для std::unique_ptr нельзя без приседаний получить pointer&
а значит для поддержки expired потребуется совершить некоторые телодвижения.

сразу закономерный вопрос: нафига это нужно?

Я так понял: "зачем ... нужен?" - это ваш коронный вопрос. А зачем нужен std::weak_ptr::expired()?

очень правильный вопрос.
дело в том, что std::weak_ptr::expired() - это очень вредный метод

это - зло, ставшее причиной множества багов.

у этого зла есть имя: "функционал, который даёт ложное чувство безопасности"

я сам лично неоднократно встречал такой код:

Код:
if(!weak.expired())
    weak.lock()->work();  // <--- баг


weak не контролирует время жизни ресурса.
то, что он ещё не протух, не значит, что не протухнет в след. мгновение.


правильный код должен быть:

Код:
if(!weak.expired())
{
    auto shared = weak.lock();
    if(shared)
       shared ->work();  // <--- ok
}

только шаред может дать гарантию.

так зачем же все таки нужен метод weak_ptr::expired() ?
собака зарыта в методе lock.
lock лочит разделяемые между потоками данные shared.
что как известно - не бесплатно.

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

Код:
if(!weak.expired())  // <--- быстрая проверка
{
    auto shared = weak.lock();  // <--- медленный лок

    if(shared) // <--- окончательная проверка
       shared ->work();  // <--- можно работать
}




Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #48 : Февраль 10, 2020, 12:29 »

weak не контролирует время жизни ресурса.
то, что он ещё не протух, не значит, что не протухнет в след. мгновение.

Зато если он протух, это признак того, что объект помер и можно выполнить соответствующие похоронные действия. Или ничего не делать. Вот и весь функционал expired, не более.
Записан

Пока сам не сделаешь...
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #49 : Февраль 10, 2020, 12:40 »

weak не контролирует время жизни ресурса.
то, что он ещё не протух, не значит, что не протухнет в след. мгновение.

Зато если он протух, это признак того, что объект помер и можно выполнить соответствующие похоронные действия. Или ничего не делать. Вот и весь функционал expired, не более.

его завезли только ради возможности не лочить шаред зазря.

если бы получение шареда было быстрым,
тогда expired бы сейчас не существовало.

Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #50 : Февраль 10, 2020, 12:41 »

Зато если он протух, это признак того, что объект помер и можно выполнить соответствующие похоронные действия. Или ничего не делать. Вот и весь функционал expired, не более.
Ну так в однопоточном режиме expired юника как раз:
Код
C++ (Qt)
if( (auto p = unique_ptr.get()) )
{
 p->do();
 p->bar();
}
 
Пока вы контролируете поток исполнения вы видите в каком месте этот юник может умереть. И если такой момент присутствует, то просто проверяете валидность указателя после него еще раз.
В однопоточной среде с этим нет никаких проблем.
Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #51 : Февраль 10, 2020, 12:50 »

Зато если он протух, это признак того, что объект помер и можно выполнить соответствующие похоронные действия. Или ничего не делать. Вот и весь функционал expired, не более.
Ну так в однопоточном режиме expired юника как раз:
Код
C++ (Qt)
if( (auto p = unique_ptr.get()) )
{
 p->do();
 p->bar();
}
 
Пока вы контролируете поток исполнения вы видите в каком месте этот юник может умереть. И если такой момент присутствует, то просто проверяете валидность указателя после него еще раз.
В однопоточной среде с этим нет никаких проблем.



хочется держать сам юник в одном месте,
а вики на него - в 10 других местах.

и вот в этих местах нужно знать: протух ресурс, или нет.


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

если же сам юник протухнет,
считай что его вики в виде сырых указателей так же протухли

Код:
auto*& example::get_weak()
{
    return &owner; // std::unique_ptr<some>
}







Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #52 : Февраль 10, 2020, 13:00 »

его завезли только ради возможности не лочить шаред зазря.

если бы получение шареда было быстрым,
тогда expired бы сейчас не существовало.

Когда шаред залочить не получается, это тоже признак того, что объект помер, и weak находится в состоянии "expired". Т.е. условно проверка weak на bool в if() направит в ветку else. Вот эта функциональность и нужна: узнать, что объект помер.

Ну так в однопоточном режиме expired юника как раз:
Код
C++ (Qt)
if( (auto p = unique_ptr.get()) )
{
 p->do();
 p->bar();
}
 
Пока вы контролируете поток исполнения вы видите в каком месте этот юник может умереть. И если такой момент присутствует, то просто проверяете валидность указателя после него еще раз.
В однопоточной среде с этим нет никаких проблем.

А если объекты и связи между ними создаются и удаляются динамически? По-моему, проблемы могут возникнуть.
Записан

Пока сам не сделаешь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #53 : Февраль 10, 2020, 13:01 »

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

Придется добавлять свой умный указатель и шарить юник. Так зачем шарить юник если есть shared. Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #54 : Февраль 10, 2020, 13:03 »

А если объекты и связи между ними создаются и удаляются динамически? По-моему, проблемы могут возникнуть.
Ну так в однопоточной среде можно проверить еще раз:
Код
C++ (Qt)
if( (auto p = unique_ptr.get()) )
{
 p->do();
 p->bar();
}
 
xrenEgoZnaet();
 
// Проверяем повторно
if( (auto p = unique_ptr.get()) )
{
 p->foo();
 p->bla();
}
 
Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #55 : Февраль 10, 2020, 13:09 »

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

Придется добавлять свой умный указатель и шарить юник. Так зачем шарить юник если есть shared. Улыбающийся

ну вот они не хотят ничего не шарить.

а хотят просто получить вик с юника,
который им скажет: протух ресурс или нет?

Код:
if(weak)
    weak->work();  // то, что это не безопасно, их не смущает.



Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #56 : Февраль 10, 2020, 13:10 »

Ну так в однопоточной среде можно проверить еще раз:
...

Вот пример задачи Car. Даже для однопоточного варианта, какое решение предложите?
Записан

Пока сам не сделаешь...
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #57 : Февраль 10, 2020, 13:14 »

Ну так в однопоточной среде можно проверить еще раз:
...

Вот пример задачи Car. Даже для однопоточного варианта, какое решение предложите?

формулировка задачи: "один движок - много мониторов"
"один ресурс - множество потребителей" - привет, shared!



Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #58 : Февраль 10, 2020, 13:19 »

формулировка задачи: "один движок - много мониторов"
"один ресурс - множество потребителей" - привет, shared!

Я и не сомневался. Но там и другие требования есть. Например:
Один Engine можно установить только в один Car. Установка одного и того же Engine в несколько разных Car недопустима.

Как его соблюдать предлагаете?
Записан

Пока сам не сделаешь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #59 : Февраль 10, 2020, 13:20 »

Вот пример задачи Car. Даже для однопоточного варианта, какое решение предложите?
То что в стандартной библиотеке нет указателей с необходимыми свойствами я не спорю. Улыбающийся
Я подумаю еще над задачей, но на первый взгляд я бы использовал shared с какой нибудь проверкой на количество в рантайм.
Но я подумаю.
Записан
Страниц: 1 2 3 [4] 5 6 ... 9   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.131 секунд. Запросов: 23.