QMap + QThread |
Здравствуйте, гость ( Вход | Регистрация )
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 |
То есть, если не лочить процесс изъятия элемента из карты, то вызванный метод ненароком может прочесть 1 элемента, а изъять совсем другой? Верно абсолютно. А если элемент не извлекать вовсе, а только считывать его? Каким образом отсутствие мьютекса, в таком случае, может вызвать краш? Предположим поток 1 записывает данные, а поток 2 считывает. Запись данных приводит к вызову метода, внутри которого изменяются сами данные и структура их хранения. Например, в реализации Qt для QMap сначала физически удаляются данные (вызывается деструктор), связанные с элементом, а затем правится структура QMap. Так вот, без мьютекса, если метод чтения потока 2 будет вызван после удаления данных потоком 1, но до изменения структуры данных потоком 1, то это и может привести к крешу. |
|
|
AXELman4ever |
3.11.2011, 11:28
Сообщение
#3
|
Студент Группа: Участник Сообщений: 31 Регистрация: 22.9.2011 Пользователь №: 2902 Спасибо сказали: 0 раз(а) Репутация: 0 |
Например, в реализации Qt для QMap сначала физически удаляются данные (вызывается деструктор), связанные с элементом, а затем правится структура QMap. Так вот, без мьютекса, если метод чтения потока 2 будет вызван после удаления данных потоком 1, но до изменения структуры данных потоком 1, то это и может привести к крешу. Блин, действительно же, как я мог забыть что QMap постоянно производит реструктуризацию своего дерева. Спасибо, Вам большое. Я открыл для себя очень многое, благодаря Вашим ответам |
|
|
Текстовая версия | Сейчас: 22.11.2024, 20:02 |