crossplatform.ru

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

> QMap + QThread
AXELman4ever
  опции профиля:
сообщение 27.10.2011, 12:21
Сообщение #1


Студент
*

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

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




Репутация:   0  


Добрый день!

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

Посему хочу просить помощь в просвещении того как ораганизовать подобную связку.

1-ое:
Имеется 2 дочерних потока ("вытекающие" из мейн потока). Цель такова:

1 поток должен заносить значения в карту (QMap),
2 поток должен эти значения cчитывать.

То есть, осуществляется общение (если концепция этого слова мне ясна) между потоками.

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

2-ое:
Так же буду благодарен, если кто-нибудь предоставит мне не большой пример, по работе с одной общей переменой (к примеру с int'ом) из двух потоков - 1 поток пишет значение, 2-ой - читает его. Я так понимаю - здесь необходимо задействовать мютекс.

Всё что я знаю, так это то, что переменная не может иметь спецификатор static, по скольку это не безопасно (но я не понимаю почему).

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

Какие еще существуют средства обмена данными между потоками в QT, если не брать во внимание наличие механизма сигнал/слот?



Объясните пожалуйста кому не сложно. Читал кучу инфы, перелопатил много гугла, но везде только примитивные малоинформативные примеры и практически никакого объяснения. Заранее благодарен :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
ssoft
  опции профиля:
сообщение 3.11.2011, 7:45
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 130
Регистрация: 17.2.2010
Из: Москва
Пользователь №: 1470

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




Репутация:   3  


Цитата(AXELman4ever @ 3.11.2011, 0:13) *
То есть, если не лочить процесс изъятия элемента из карты, то вызванный метод ненароком может прочесть 1 элемента, а изъять совсем другой?

Верно абсолютно.

Цитата(AXELman4ever @ 3.11.2011, 0:13) *
А если элемент не извлекать вовсе, а только считывать его? Каким образом отсутствие мьютекса, в таком случае, может вызвать краш?


Предположим поток 1 записывает данные, а поток 2 считывает.
Запись данных приводит к вызову метода, внутри которого изменяются сами данные и структура их хранения.

Например, в реализации Qt для QMap сначала физически удаляются данные (вызывается деструктор), связанные с элементом, а затем правится структура QMap.

Так вот, без мьютекса, если метод чтения потока 2 будет вызван после удаления данных потоком 1, но до изменения структуры данных потоком 1, то это и может привести к крешу.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AXELman4ever
  опции профиля:
сообщение 3.11.2011, 11:28
Сообщение #3


Студент
*

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

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




Репутация:   0  


Цитата(ssoft @ 3.11.2011, 7:45) *
Например, в реализации Qt для QMap сначала физически удаляются данные (вызывается деструктор), связанные с элементом, а затем правится структура QMap.

Так вот, без мьютекса, если метод чтения потока 2 будет вызван после удаления данных потоком 1, но до изменения структуры данных потоком 1, то это и может привести к крешу.


Блин, действительно же, как я мог забыть что QMap постоянно производит реструктуризацию своего дерева. Спасибо, Вам большое. Я открыл для себя очень многое, благодаря Вашим ответам :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- AXELman4ever   QMap + QThread   27.10.2011, 12:21
- - wiz29   1. QMap не потокобезопасен. Делай класс обертку дл...   27.10.2011, 14:28
|- - AXELman4ever   Цитата(wiz29 @ 27.10.2011, 14:28) 1. QMap...   27.10.2011, 15:20
|- - AXELman4ever   Цитата(AXELman4ever @ 27.10.2011, 15:20) ...   27.10.2011, 16:04
- - ssoft   Например, что-то такое template< typename _Ke...   27.10.2011, 17:40
|- - AXELman4ever   Цитата(ssoft @ 27.10.2011, 17:40) Наприме...   27.10.2011, 18:55
|- - ssoft   Цитата(AXELman4ever @ 27.10.2011, 19:55) ...   28.10.2011, 8:13
|- - AXELman4ever   Цитата(ssoft @ 28.10.2011, 8:13) PS. Жмем...   28.10.2011, 9:42
|- - AXELman4ever   А у меня еще вопрос: Если не залочить insert() ме...   30.10.2011, 6:31
|- - ssoft   Цитата(AXELman4ever @ 30.10.2011, 7:31) А...   31.10.2011, 7:46
|- - AXELman4ever   Цитата(ssoft @ 31.10.2011, 7:46) Если обр...   31.10.2011, 13:47
- - ssoft   Цитата(AXELman4ever @ 31.10.2011, 14:47) ...   31.10.2011, 13:53
|- - AXELman4ever   1: Уточню: QMap принадлежит только главному пото...   31.10.2011, 19:11
- - ssoft   В такой реализации скрыта серьезная ошибка. Правда...   1.11.2011, 8:46
- - AXELman4ever   Премного благодарен за толковое разъяснение. 1. ...   1.11.2011, 13:33
- - ssoft   Цитата(AXELman4ever @ 1.11.2011, 14:33) ...   1.11.2011, 16:45
- - AXELman4ever   ЦитатаОпасность в одновременном не синхронизирован...   1.11.2011, 18:23
- - ssoft   Начиналось все с того, что Цитата(AXELman4ever ...   2.11.2011, 17:17
- - AXELman4ever   Замечательно, вижу свет в конце тоннеля За что, ...   2.11.2011, 23:13
- - ssoft   Цитата(AXELman4ever @ 3.11.2011, 0:13) То...   3.11.2011, 7:45
- - AXELman4ever   Цитата(ssoft @ 3.11.2011, 7:45) Например,...   3.11.2011, 11:28


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


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




RSS Текстовая версия Сейчас: 22.11.2024, 20:02