Сообщение COW and thread safety in Qt от 10.10.2023 9:39
Изменено 10.10.2023 11:02 Skorodum
Дата: 09.10.23
Что ты под копированием данных для объектов с COW имеешь в виду? Звучит так же мутно, как и qtшная документация Делается ли deep или shallow copy и в каком потоке это делается, если emit сигнала и вызов слота происходят в разных потоках? Есть ли гарантия, что это делается единообразно во всех релизах Qt начиная с N.K? Я не нашел внятного ответа на этот вопрос в свое время и всегда детачил копию контейнера перед тем как ее в сигнал засовывать. Ну это пока еще использовал эти контейнеры вообще.
Я постарался сделать минимальный пример который демострирует поведение Qt классов с COW при использовании в разных потоках.
TLDR: Для хрестоматийного использования Qt (когда в одном потоке есть источник данных (сеть/диск/и т.д.) и какая-то обработка в другом потоке, например отображение) можно обойтись без явной синхронизации данных и пользоваться бонусами COW. И все это рабоет с 4-й версии без изменений (почти 20 лет).
CMakeLists.txt | |
| |
main.cpp | |
| |
Ссылки по теме:
implicit sharing
Threads and Implicitly Shared Classes
Implicit sharing iterator problem
Дата: 09.10.23
TLDR: Для хрестоматийного использования Qt (когда в одном потоке есть источник данных (сеть/диск/и т.д.) и какая-то обработка в другом потоке, например отображение) можно обойтись без явной синхронизации данных и пользоваться бонусами COW.
Документация отвечат очень хорошо:Что ты под копированием данных для объектов с COW имеешь в виду?
A deep copy implies duplicating an object. A shallow copy is a reference copy, i.e. just a pointer to a shared data block. Making a deep copy can be expensive in terms of memory and CPU. Making a shallow copy is very fast, because it only involves setting a pointer and incrementing the reference count.
Object assignment (with operator=()) for implicitly shared objects is implemented using shallow copies.
Тут надо отделить копирование от потока выполнения кода (слота).Делается ли deep или shallow copy и в каком потоке это делается, если emit сигнала и вызов слота происходят в разных потоках?
- * Копирование происходит "in all member functions that change the internal data", т.е. во всех не const методах. В каком потоке это происходит не важно.
* Поток, в котором выполняется слот, зависит от типа соединения, по умолчанию "The slot is executed in the receiver's thread". Подробнее тут.
Этот механизм работает с Qt 4, т.е. 20 лет.Есть ли гарантия, что это делается единообразно во всех релизах Qt начиная с N.K?
Я постарался сделать минимальный пример который демострирует поведение Qt классов с COW при использовании в разных потоках.
CMakeLists.txt | |
| |
main.cpp | |
| |
Ссылки по теме:
implicit sharing
Threads and Implicitly Shared Classes
Implicit sharing iterator problem