Название: Многопоточная запись/чтение implicitly-shared классов Отправлено: Akon от Октября 30, 2011, 11:33 Часто приходится видеть такое:
Код: QByteArray a("some data"); В документации сказано о безопасности счетчика ссылок и о небезопасности расшаренных данных. Вероятно, у многих (в т.ч. и у меня) создается впечатление, что shallow copy Код: const QByteArray b = a; Безопасный доступ: сериализация (мьютексы) и lock-free вариант, приведенный ниже: Код: // lock-free имхо, как-то стоило бы отразить эту проблему в документации, например, в boost подобное использование разжевано для boost::shared_ptr. Название: Re: Многопоточная запись/чтение implicitly-shared классов Отправлено: Igors от Октября 30, 2011, 14:01 Ну Вы бы уж "разжевали" для широкого круга читателей напр
Код Читающая нитка может вклиниться перед qFree и рухнуть. Чтобы исключить такое дело надо запастись счетчиком ссылок >= 2. Добавим что читающий может получить как новые так и старые данные - как получится Название: Re: Многопоточная запись/чтение implicitly-shared классов Отправлено: Akon от Октября 30, 2011, 19:43 Да, спасибо за дополнение-"разжевку".
Название: Re: Многопоточная запись/чтение implicitly-shared классов Отправлено: Авварон от Октября 30, 2011, 20:03 Igors
присваивание шаред данных атомарно. никто никуда вклинится не может. Название: Re: Многопоточная запись/чтение implicitly-shared классов Отправлено: Igors от Октября 30, 2011, 20:58 присваивание шаред данных атомарно. никто никуда вклинится не может. Уголовники показывают костяшку домино 5/6 и говорят "выбирай". Что выберет умный человек? :) Вот также и читающая нитка Название: Re: Многопоточная запись/чтение implicitly-shared классов Отправлено: andrew.k от Октября 30, 2011, 21:02 Поясни про уголовников?)
Название: Re: Многопоточная запись/чтение implicitly-shared классов Отправлено: Igors от Октября 30, 2011, 21:08 Код
Название: Re: Многопоточная запись/чтение implicitly-shared классов Отправлено: Авварон от Октября 30, 2011, 21:11 2 нитки _не могут_ владеть 1й копией. у каждой нитки свой d.
Название: Re: Многопоточная запись/чтение implicitly-shared классов Отправлено: Akon от Октября 30, 2011, 21:50 Это так, до поры
Код: d = other.d; Про уголовников тоже интересно. Название: Re: Многопоточная запись/чтение implicitly-shared классов Отправлено: andrew.k от Октября 30, 2011, 21:52 2 нитки _не могут_ владеть 1й копией. у каждой нитки свой d. А почему? В том смысле, где это написано?Qt uses an optimization called implicit sharing for many of its value class, notably QImage and QString. Beginning with Qt 4, implicit shared classes can safely be copied across threads, like any other value classes. They are fully reentrant. The implicit sharing is really implicit. Threads and Implicitly Shared Classes (http://doc.crossplatform.ru/qt/4.6.x/threads-modules.html) Какой из этого вывод? Название: Re: Многопоточная запись/чтение implicitly-shared классов Отправлено: Авварон от Октября 30, 2011, 22:04 andrew.k не, это я туплю просто. Название: Re: Многопоточная запись/чтение implicitly-shared классов Отправлено: Akon от Октября 30, 2011, 22:10 Ну там дальше написано
Цитировать ... Atomic reference counting does, however, guarantee that a thread working on its own, local instance of an implicitly shared class is safe. ... Но проблема возникает как раз при переустановке своего d.Авварон у вас создалось впечатление :) Название: Re: Многопоточная запись/чтение implicitly-shared классов Отправлено: andrew.k от Октября 30, 2011, 22:10 Тогда, что получается по теме? я не очень понимаю.
Нужно использовать мютексы при доступе к QByteArray? Потому что без них ерунда какая-то получается. Мыль ТС я не очень понял. Точнее приведенный там код. Название: Re: Многопоточная запись/чтение implicitly-shared классов Отправлено: andrew.k от Октября 30, 2011, 22:12 Ну там дальше написано Цитировать ... Atomic reference counting does, however, guarantee that a thread working on its own, local instance of an implicitly shared class is safe. ... Но проблема возникает как раз при переустановке своего d.Получается другой поток в принципе не увидит изменений сделанных другим потоком. Название: Re: Многопоточная запись/чтение implicitly-shared классов Отправлено: Igors от Октября 31, 2011, 09:55 Код Допустим d->ref.defref() вернул false и в этот момент ОС передал управление др. нитке. Конечно d = other.d выполнится атомарно, но это будет потом, когда текущая нитка снова получит управление. А сейчас в читающей нитке это d пройдет как член other, ну читатель увеличит счетчик ref и присвоит указатель d своему. Может даже успеет что-то сделать пока проснувшаяся нитка не выполнит qFree :) Название: Re: Многопоточная запись/чтение implicitly-shared классов Отправлено: andrew.k от Октября 31, 2011, 13:45 Код Конечно d = other.d выполнится атомарно, Или атомарно выполняется только operator= внутри другого operator=? ) Название: Re: Многопоточная запись/чтение implicitly-shared классов Отправлено: Akon от Октября 31, 2011, 14:25 Цитировать Тогда, что получается по теме? я не очень понимаю. Для данного юзкейса (simultaneously reading/writing) сериализованный доступ (мьютексы) один из вариантов.Нужно использовать мютексы при доступе к QByteArray? Потому что без них ерунда какая-то получается. Мыль ТС я не очень понял. Точнее приведенный там код. Кто такой ТС? Цитировать Получается другой поток в принципе не увидит изменений сделанных другим потоком. Нет, увидит.Название: Re: Многопоточная запись/чтение implicitly-shared классов Отправлено: andrew.k от Октября 31, 2011, 15:10 ТС - топик стартер. Тот, кто начал тему.
|