Поиск:

Ответ в темуСоздание новой темы Создание опроса
> QString из многих потоков, Межпоточное обращение 
V
    Опции темы
null56
Дата 3.3.2009, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



Собственно проблема возникла в связи с тем, что возникли критические секции, в которых приходится обращаться к переменным типа QString.
Приведу пример кода, который хотелось бы обсудить
Код

QString MyClass :: getMyString()
{
    QMutexLocker lock(mutex);
    return m_MyString;
}

В стл, так же как и в qt полная перезапись происходит лишь в случае изменения в одной из ссылочных копий, то есть полного копирования не произойдет и в этом случае
Код

QString MyClass :: getMyString()
{
   QMutexLocker lock(mutex);
   QString str = m_MyString;
   return str;
}


Изменение происходит в функции
Код

void MyClass :: setMyString(const QString & rString)
{
     QMutexLocker lock(mutex);
     m_MySting = rString;
}


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

Вопросы:
1) Как верно заставить отработать данные функции, чтобы при возврате из функции было достоверное значение, которое было в момент обращения или же механизм копирования по изменению, зная уже о наличии новой ссылке в стеке, сделает полную копию строки из потока вызывающего функцию set...?
2) Cуществует ли вариант принудительного копирования строки, не полагаясь на механизм копирования по изменению?

Заранее благодарен за помощь всем откликнувшимся
PM MAIL   Вверх
pan2004
Дата 3.3.2009, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 357
Регистрация: 28.7.2007

Репутация: 6
Всего: 9



null56, не забивай себе голову. Раньше у Qt с строками(и др подобными объектами) в многопоточном приложении были такие проблемы, сейчас(где-то начиная с Qt4) документация гарантирует корректное разруливание этих ситуаций без вмешательства пользователя, так что внешне строка выглядит и ведет себя точно так же, как будто бы этого shared механизма и не было бы.


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
null56
Дата 4.3.2009, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



Цитата(pan2004 @ 3.3.2009,  16:57)
null56, не забивай себе голову. Раньше у Qt с строками(и др подобными объектами) в многопоточном приложении были такие проблемы, сейчас(где-то начиная с Qt4) документация гарантирует корректное разруливание этих ситуаций без вмешательства пользователя, так что внешне строка выглядит и ведет себя точно так же, как будто бы этого shared механизма и не было бы.

Наверное вы правы, но использование мьютекса для создание новой ссылки, я все думаю делать стоит... чтобы уж наверняка... остальное должен обеспечить Qt
Код

QMutexLocker lock(mutex);
return m_String;

Тогда прежде чем разблокировать доступ к строке, в стек поместится очереденая ссылка на строку и обращение на изменение, УЖЕ ПОСЛЕ разблокировки мьютекса, будет сначала копировать, а лишь потом изменять

Спасибо, поэспериментировать все же надо )
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0412 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.