Re[5]: COW and thread safety in Qt
От: andyp  
Дата: 12.10.23 08:48
Оценка:
Здравствуйте, 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>


Понятно, что здесь отцепится, и у консьюмера будет буфер со своим указателем.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.