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

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

Страниц: 1 ... 3 4 [5] 6 7 8   Вниз
  Печать  
Автор Тема: Использование QWaitCondition  (Прочитано 72803 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #60 : Декабрь 24, 2012, 13:17 »

И опять появляется некое count? Или у вас опечаточка с numTask?
Он и не исчезал. Просто QWaitCondition нужен др счетчик, я его и добавил (numTask)
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3259


Просмотр профиля
« Ответ #61 : Декабрь 24, 2012, 14:25 »

Что-то я всё равно не понял. На просьбу показать параллельность Igors процитировал исходный пример кутешников.
А в его-то исправленном коде где анлок?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #62 : Декабрь 24, 2012, 14:28 »

Что-то я всё равно не понял. На просьбу показать параллельность Igors процитировал исходный пример кутешников.
А в его-то исправленном коде где анлок?
Так я же вызываю HandleTask. Никаких новых lock/unlock не было добавлено
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3259


Просмотр профиля
« Ответ #63 : Декабрь 24, 2012, 14:43 »

А, туплю.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #64 : Декабрь 24, 2012, 15:01 »

Код
C++ (Qt)
// thread worker
forever {
    mutex.lock();
    while (!numTask)
        keyPressed.wait(&mutex);
 
    --numTask;
    HandleTask();
    mutex.unlock();
}
 
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #65 : Декабрь 24, 2012, 15:05 »

В Qt примере можно было запустить 5 воркеров и управляющий поток мог их параллельно запускать.
Сейчас не так.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #66 : Декабрь 24, 2012, 15:10 »

Код
C++ (Qt)
// thread worker
forever {
    mutex.lock();
    while (!numTask)
        keyPressed.wait(&mutex);
 
    --numTask;
    HandleTask();
    mutex.unlock();
}
 
Согласен, так элегантнее
В Qt примере можно было запустить 5 воркеров и управляющий поток мог их параллельно запускать.
Сейчас не так.
Поясните почему
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #67 : Декабрь 24, 2012, 15:17 »

Поясните почему

Код
C++ (Qt)
//control thread
forever {                                 // numTask = 0
    getchar();                          // Пользователь нажал кнопку
    mutex.lock();
    CreateTask();
    ++numTask;                        // numTask = 1
    mutex.unlock();
    keyPressed.wakeAll();           // Проснулись рабочие нитки, первая установит numTask = 0 и пойдет работать, а остальные рабочие нитки уснут на wait
}
 
« Последнее редактирование: Декабрь 24, 2012, 15:19 от Old » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #68 : Декабрь 24, 2012, 15:39 »

(не цитирую для экономии места). Да, мы создаем 1 задачу и будим только одну нитку, с этой точки зрения аккуратнее wakeOne. Но никто не мешает увеличить numTask на 2 или больше и тогда уже wakeAll. В любом случае сколько задач создать решает производитель. А в исходном примере некоторые рабочие нитки (потребители) могли остаться непробужденными, а задачи утерянными.
Записан
Dancing_on_water
Гость
« Ответ #69 : Декабрь 24, 2012, 15:51 »

Код:
Просто добавляем счетчик
// thread worker
forever {
     mutex.lock();
     if (!numTask)
       keyPressed.wait(&mutex);
     if (numTask) {
       --numTask;
       HandleTask();
     }
     mutex.unlock();
}
//control thread
forever {
     getchar();
     mutex.lock();
     CreateTask();
     ++numTask;
     mutex.unlock();
     keyPressed.wakeAll();
}

И сели в лужу, если потребителей больше создателей. Ситуация: создатель разбудил всех и ушел следующий чар ждать. numTask =1; Просыпается рабочий уменьшает счетчик numTask =0; За ним проспается второй рабочий, обнаруживает, что счетчик нулевой и уходит спать.
« Последнее редактирование: Декабрь 24, 2012, 15:56 от Dancing_on_water » Записан
Bepec
Гость
« Ответ #70 : Декабрь 24, 2012, 16:51 »

Кстати последнее замечание верно Улыбающийся

PS Igors добавь свою "очевидную" функцию в то сообщение. А то народ как и я умением видеть невидимое обделены Веселый
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #71 : Декабрь 24, 2012, 17:16 »

И сели в лужу, если потребителей больше создателей. Ситуация: создатель разбудил всех и ушел следующий чар ждать. numTask =1; Просыпается рабочий уменьшает счетчик numTask =0; За ним проспается второй рабочий, обнаруживает, что счетчик нулевой и уходит спать.
Видимо в азарте меня уличить Вы не увидели мой предыдущий пост Улыбающийся Да, именно так все и происходит, а чего будить 2 или более рабочих если работа есть только для одного? Дайте больше работ и будите больше работников. Заметим что для каких-то целей такая побудка все же годится (напр проснувшиеся могут проверить флажок abort)

PS Igors добавь свою "очевидную" функцию в то сообщение. А то народ как и я умением видеть невидимое обделены Веселый
Вижу - начинаете борзеть, значит пора дать следующую задачу Улыбающийся Может лучше завтра создать новую тему, а то уже 5 листов, тяжеловато?  Или уже все ясно и больше не нужно?  Улыбающийся
Записан
Bepec
Гость
« Ответ #72 : Декабрь 24, 2012, 17:39 »

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

И да, у вас опять же пример перекорёжен. Вместо побудки свободных потоков у вас опять таки идёт побудка какого то "определённого" количества.

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

PS А то получается как в сказке - обещал ему полцарства и коня, а дал палку с надписью полцарства и конь.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #73 : Декабрь 24, 2012, 17:52 »

вызывает стойкое желание прекращать разговоры.
Хорошо, умолкаю  Улыбающийся
Записан
Dancing_on_water
Гость
« Ответ #74 : Декабрь 24, 2012, 17:53 »

Видимо в азарте меня уличить Вы не увидели мой предыдущий пост Улыбающийся Да, именно так все и происходит, а чего будить 2 или более рабочих если работа есть только для одного? Дайте больше работ и будите больше работников. Заметим что для каких-то целей такая побудка все же годится (напр проснувшиеся могут проверить флажок abort)
Когда, я начинал писать двух постов передо мной не было. Когда запостил, каюсь, не посмотрел. Но предложенный вами вариант решение проблемы с numTask - магическое число и это крайне плохое решение. Любой программист с опытом это подтвердит.

Однако это не все, вы говорите, что ошибка - пропуск задачи. Рассмотрим систему реального времени (каюсь, моя специлизация, поэтому беру примеры из этой области). Если потребитель зашел в wait позже, чем было выдано очередное задание, то это нештатная ситуация, т.к. при грамотном проектировании у него должен быть запас времени. Если этого запаса не хватило, это значит, что кто-то или что-то отжимает у него процессорные мощности. И если мы сейчас принудим его уйти на обработку мы рискуем сорвать временную диаграмму всей программы. В этом случае единственно верное решение - пропустить побудку и дать этому кому-то завершить свои дела. Такая ситуация и ее решение противоречит с вашим посылом.

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

P.S. Ваши комплексы продолжают быть забавными. Старайтесь в том же духе.
Записан
Страниц: 1 ... 3 4 [5] 6 7 8   Вверх
  Печать  
 
Перейти в:  


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