Russian Qt Forum
Ноябрь 22, 2024, 22:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: (РЕШЕНО) QWaitCondition::wait() в разных версиях  (Прочитано 10571 раз)
vulko
Гость
« Ответ #15 : Ноябрь 19, 2014, 09:39 »

Если много потоков могут делать pause/wake, то конечно нужен.
А если один, то мьютекс передаваемый в wait() может никем никогда не использоваться.
Ну их как минимум два: один останавливающий, второй - останавливаемый.
И лучше сразу все делать правильно (никаких сложностей в этом нет), это сейчас поток один, а завтра их может быть уже 100500.


Насчет 2-х потоков не соглашусь.
Мьютекс тут совсем не обязателен, т.к. если pause выставлен в true из другого потока, не далее как на следущей итерации поток зайдет внутрь if(pause) и встанет в wait, до тех пор пока первый поток не вызовет resume().


Правильно сделать лучше, согласен, но тут эксперт англ. из 90-х забыл уточнить условия... Улыбающийся))
Он кстати вообще говорил, что "поток с мьютексом без мьютекса" нельзя использовать, т.к. "мьютекс может быть, а может и не быть". И вообще завтра может быть уже сегодня...)))
А тут и мьютекс и CV решил сразу нашлёпать...)))
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Ноябрь 19, 2014, 10:06 »

Просто если бы wait(&mutex) возвращал false при разлоченном мутексе, это было бы удобной информацией о доступности ресурса, значит его можно захватить (сделать mutex.lock()) и обрабатывать.
Не можно.

Код:
if( ! condition.wait(&mutex) )  // по описанию 4.7 должно быть false, если мутекс не залочен, но тут падает
    mutex.lock();
Пусть condition.wait вернуло false, но это значит что ресурс доступен в данный момент (до выполнения mutex.lock()). А когда выполнится mutex.lock(), доступность может быть уже совсем другая

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

Схемв (Q)WaitCondition всегда одна и та же, ее надо тупо переписывать  
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #17 : Ноябрь 19, 2014, 14:55 »

Использовать мутекс в качестве флага плохая идея, тогда уж лучше взять семафор.

Не вполне понятно, при чем тут семафор, который для разруливания M запросов к N ресурсам. Ну да ладно...

Судя по описанию в 4.7 именно как флаг и подразумевалось, но так не работает, и в дальнейшем от этого отказались. Меня именно это и интересовало. Ответ на свой вопрос я получил, ветку можно закрыть, дабы не возбуждать некоторых участников до уровня тролля 80-го левела.
« Последнее редактирование: Ноябрь 19, 2014, 14:57 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 23.