Здравствуйте, Skorodum, Вы писали:
S>Все правильно: у нас все тот же объект, никакой глубокой копии не произошло.
Как же правильно? Получили в двух нитках один и тот же буфер внутри двух разных qtvector в продьюсере и консьюмере. Если общее состояние (счётчик ссылок) и глубокое копирование не защищены каким-то примитивом синхронизации, то будут гонки, если несколько ниток попытаются использовать неконстантные операции со своим контейнером. Если синхронизация есть, то будут тормоза не только той нитки, которой понадобилась копия, но и остальных. О чем и писал ещё в старой ветке обсуждения.
Если Foo только формально константен (внутри есть mutable члены), то будут гонки даже с синхронизацией внутри контейнера — он просто не будет знать, что нужно сериализовать доступ к Foo.
Опять же, как там и писал — опасно все это и чревато тормозами в совсем уж нежданных местах. Весь этот шум про корову идёт с конца 90х имхо. Уже тогда некоторым стало понятно, что втыкать синхронизацию в методы контейнера — не очень хорошая идея. Не та гранулярность получается. Подробности например здесь:
http://www.gotw.ca/publications/optimizations.htm
S>Посмотрите, как измениться вывод, если раскомментировать это
S>S>//foo.append(Foo()); // <- comment out to see effect of COW
S>
Понятно, что здесь отцепится, и у консьюмера будет буфер со своим указателем.