Синхронизация при сигналах и слотах в разных потоках |
Здравствуйте, гость ( Вход | Регистрация )
Синхронизация при сигналах и слотах в разных потоках |
Алексей1153 |
22.1.2013, 12:59
Сообщение
#1
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
Вопрос: когда сигнал и слот имеют аргументы по значению (то есть, не указатели и не ссылки), нужно ли выполнять межпоточную синхронизацию, если я из одного потока шлю сигнал в слот другого? Понимаю, что глупый вопрос, поэтому задам его по-другому: в каких случаях при использовании сигнала в одном потоке и слота в другом требуется синхронизация ? Ситуация простейшая - передаю, к примеру, QString по значению из потока в поток Сообщение отредактировал Алексей1153 - 23.1.2013, 8:23 |
|
|
ssoft |
24.1.2013, 9:01
Сообщение
#2
|
Участник Группа: Участник Сообщений: 130 Регистрация: 17.2.2010 Из: Москва Пользователь №: 1470 Спасибо сказали: 30 раз(а) Репутация: 3 |
1. Если передача параметров происходит по значению.
то при асинхронном вызове (через очередь сообщений), передаваемые данные копируются и синхронизировать ничего не нужно. 2. Если передача параметров происходит по указателю по не константной ссылке.
то при асинхронном вызове копируется значение указателя (ссылки), за существование объекта QString и синхронизацию доступа к нему отвечает сам программист. Сообщение отредактировал ssoft - 24.1.2013, 9:04 |
|
|
iReset |
24.1.2013, 9:40
Сообщение
#3
|
Участник Группа: Участник Сообщений: 178 Регистрация: 6.6.2012 Пользователь №: 3414 Спасибо сказали: 23 раз(а) Репутация: 2 |
1. Если передача параметров происходит по значению. ... то при асинхронном вызове (через очередь сообщений), передаваемые данные копируются и синхронизировать ничего не нужно. А вот для меня этот ответ не совсем полон и остаются вопросы. Поясню: 1. Все функции в классе QString реентерабельны, за исключением некоторых (тут в самом начале). Т.е. при вызове этих функций уже необходимо обеспечивать блокировки. Другие функции, вроде бы, можно использовать в разных потоках, потому что у нас две копии QString. Но... 2. QString использует неявное разделение данных (тут 4 абзац). Т.е. обе копии QString будут указывать на одни и те же данные до их изменения. Что будет при одновременном изменении строки в одном потоке и чтении в другом? Вероятно, каша, поскольку для хранения данных в QString используется структура
и, естественно, она обновится не атомарно. Все это мои теоретические выкладки, на практике не проверял. ...я именно про случай без ссылок. Я в детали механизма сигналов/слотов глубоко не вникал - вероятно они уже имеют свои синхронизаторы для этого случая ? То есть - в некий "почтовый ящик" значение положилось, а потом его адресат (слот) вытащит, и неважно, что это из другого потока произошло Я думаю, что если в документации (тут, после примера 3 абзац) прямо сказано, что соединяться можно с использованием соединения через очередь, то это работает. а со ссылками (неважно, кстати, константные или нет) - ну тут и так понятно, что синхронизировать надо Если речь идёт про классы Qt, то не обязательно, если используются только потокобезопасные функции (тут). |
|
|
Текстовая версия | Сейчас: 25.11.2024, 16:49 |