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

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

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: Помогите понять как работают мьютексы в Qt.  (Прочитано 24020 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #30 : Март 30, 2012, 18:03 »

Igors,  вы мне предлагаете выложить вам вариант костыля использования QWaitCondition в роли семафора. Улыбающийся
А чего это Вы мне так сразу поверили что здесь семафор якобы лучше? Улыбающийся  QWaitCondition ничем не хуже, ну надо написать по 4 строчки на нитку вместо 2, чего торгуетесь? Улыбающийся Если у Вас трудности - я напишу, не вопрос. А не надо - ну так и проехали.
Записан
Bepec
Гость
« Ответ #31 : Март 30, 2012, 18:04 »

Таки я ответил на ваш вопрос ещё раньше - почитайте мои предыдущие сообщения. WaitCondition ждёт / отрабатывает / засыпает.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #32 : Март 30, 2012, 19:04 »

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

Неясно конечно в чем заключается та "подготовка к пробуждению". И вот с "одной" - ведь в ОC wake будит "хотя бы одну", но может и больше, какую тогда готовит? Понятно не все вопросы имеют (простые) ответы.
Записан
BRE
Гость
« Ответ #33 : Март 30, 2012, 20:06 »

Неясно конечно в чем заключается та "подготовка к пробуждению".
Изменение состояния нитки - флаг поменять. Ядро для каждого объекта синхронизации хранит очередь ниток, которые ожидают освобождения этого объекта. Все они имеют состояние останова. Что бы пробудить нужно это состояние поменять.

И вот с "одной" - ведь в ОC wake будит "хотя бы одну", но может и больше, какую тогда готовит? Понятно не все вопросы имеют (простые) ответы.
С условными переменными, я как разработчик, могу сказать ядру разбуди одну нить (wakeOne) не важно какую или разбудить все ожидающие нити (wakeAll).
Если я добавил одно задание в очередь заданий, то мне не нужно будить все ожидающие нити, мне будет достаточно одной. А если мне нужно, что бы все нитки завершились, то я устанавливаю флаг и прошу проснутся всех. У семафоров такой возможности нет.
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


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