Re[6]: COW and thread safety in Qt
От: Skorodum Россия  
Дата: 12.10.23 09:20
Оценка:
Здравствуйте, andyp, Вы писали:

A>Здравствуйте, Skorodum, Вы писали:


S>>Все правильно: у нас все тот же объект, никакой глубокой копии не произошло.


A>Как же правильно?

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

A>Получили в двух нитках один и тот же буфер внутри двух разных qtvector в продьюсере и консьюмере. Если общее состояние (счётчик ссылок) и глубокое копирование не защищены каким-то примитивом синхронизации, то будут гонки, если несколько ниток попытаются использовать неконстантные операции со своим контейнером. Если синхронизация есть, то будут тормоза не только той нитки, которой понадобилась копия, но и остальных. О чем и писал ещё в старой ветке обсуждения.

Все однозначно и документировано:

QSharedData provides thread-safe reference counting.


A>Если Foo только формально константен (внутри есть mutable члены), то будут гонки даже с синхронизацией внутри контейнера — он просто не будет знать, что нужно сериализовать доступ к Foo.

Не, от Foo это вообще не зависит, за это отвечает QSharedData.

A>Опять же, как там и писал — опасно все это и чревато тормозами в совсем уж нежданных местах. Весь этот шум про корову идёт с конца 90х имхо. Уже тогда некоторым стало понятно, что втыкать синхронизацию в методы контейнера — не очень хорошая идея. Не та гранулярность получается. Подробности например здесь:

A>http://www.gotw.ca/publications/optimizations.htm
Так чудес никто и не обещает. QVector это компромисное решение, но оно дает выигрышь в большинстве простых случаев. Qt это же не число-дробилка, а GUI в первую очередь. Самая типичная задача это передать данные из какого-то источника в интерфейс. Для таких задач COW это отличное решение.
Я сам недавно что-то затупил и написал кольцевой буфер для передачи данных вместо тупого использования QVector через сигналы-слоты и удивлялся почему у меня нет вообще никакой разницы в производительности.

A>Понятно, что здесь отцепится, и у консьюмера будет буфер со своим указателем.

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.