crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Синхронизация при сигналах и слотах в разных потоках
Алексей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. Если передача параметров происходит по значению.

signals:
    void foo ( QString );
    void foofoo ( const & QString );


то при асинхронном вызове (через очередь сообщений), передаваемые данные копируются и синхронизировать ничего не нужно.

2. Если передача параметров происходит по указателю по не константной ссылке.

signals:
    void foo ( QString * );
    void foo ( QString & );
    void foofoo ( const QString * );


то при асинхронном вызове копируется значение указателя (ссылки), за существование объекта QString и синхронизацию доступа к нему отвечает сам программист.

Сообщение отредактировал ssoft - 24.1.2013, 9:04
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
iReset
  опции профиля:
сообщение 24.1.2013, 9:40
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 178
Регистрация: 6.6.2012
Пользователь №: 3414

Спасибо сказали: 23 раз(а)




Репутация:   2  


Цитата(ssoft @ 24.1.2013, 10:01) *
1. Если передача параметров происходит по значению.
...
то при асинхронном вызове (через очередь сообщений), передаваемые данные копируются и синхронизировать ничего не нужно.

А вот для меня этот ответ не совсем полон и остаются вопросы. Поясню:
1. Все функции в классе QString реентерабельны, за исключением некоторых (тут в самом начале). Т.е. при вызове этих функций уже необходимо обеспечивать блокировки. Другие функции, вроде бы, можно использовать в разных потоках, потому что у нас две копии QString.
Но...
2. QString использует неявное разделение данных (тут 4 абзац). Т.е. обе копии QString будут указывать на одни и те же данные до их изменения.

Что будет при одновременном изменении строки в одном потоке и чтении в другом? Вероятно, каша, поскольку для хранения данных в QString используется структура
    struct Data {
        QBasicAtomicInt ref;
        int alloc, size;
        ushort *data;
        ushort clean : 1;
        ushort simpletext : 1;
        ushort righttoleft : 1;
        ushort asciiCache : 1;
        ushort capacity : 1;
        ushort reserved : 11;
        ushort array[1];
    };

и, естественно, она обновится не атомарно.

Все это мои теоретические выкладки, на практике не проверял.

Цитата(Алексей1153 @ 24.1.2013, 10:12) *
...я именно про случай без ссылок. Я в детали механизма сигналов/слотов глубоко не вникал - вероятно они уже имеют свои синхронизаторы для этого случая ? То есть - в некий "почтовый ящик" значение положилось, а потом его адресат (слот) вытащит, и неважно, что это из другого потока произошло

Я думаю, что если в документации (тут, после примера 3 абзац) прямо сказано, что соединяться можно с использованием соединения через очередь, то это работает.

Цитата(Алексей1153 @ 24.1.2013, 10:12) *
а со ссылками (неважно, кстати, константные или нет) - ну тут и так понятно, что синхронизировать надо

Если речь идёт про классы Qt, то не обязательно, если используются только потокобезопасные функции (тут).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- Алексей1153   Синхронизация при сигналах и слотах в разных потоках   22.1.2013, 12:59
- - Litkevich Yuriy   если по значению, то передаваемая величина просто ...   23.1.2013, 3:46
- - Алексей1153   то есть, если в параметрах нет ссылок и указателей...   23.1.2013, 8:24
- - ssoft   1. Если передача параметров происходит по значению...   24.1.2013, 9:01
|- - iReset   Цитата(ssoft @ 24.1.2013, 10:01) 1. Если ...   24.1.2013, 9:40
- - Алексей1153   ssoft, вот я именно про случай без ссылок. Я в дет...   24.1.2013, 9:12
- - Алексей1153   выходит, если указать Qt::QueuedConnection , то а...   24.1.2013, 9:57
|- - iReset   Цитата(Алексей1153 @ 24.1.2013, 10:57) вы...   24.1.2013, 10:40
- - Алексей1153   с циклом - понятно, ок Ну, видимо, класс потока с...   24.1.2013, 10:42
- - Авварон   iReset Всё там у QString нормально. У шаред классо...   24.1.2013, 22:04
|- - iReset   Цитата(Авварон @ 24.1.2013, 23:04) Всё та...   25.1.2013, 8:45
- - Авварон   Лень в доку лезть, а какие ф-ии у QString нереентр...   25.1.2013, 9:28
- - Алексей1153   Авварон, он, наверное, имел в виду не QString, а ю...   25.1.2013, 11:28
- - iReset   http://www.doc.crossplatform.ru/qt/4.7.x/qstring.h...   25.1.2013, 12:38
- - Авварон   Прикольно, даже не знал, что такие есть, всегда ис...   25.1.2013, 17:38


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


8 чел. читают эту тему (гостей: 8, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.11.2024, 16:49