Здравствуйте, 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>Понятно, что здесь отцепится, и у консьюмера будет буфер со своим указателем.