На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела *nix / gcc / Eclipse / Qt / wxWidgets / GTK+
  • При создании темы ОБЯЗАТЕЛЬНО указывайте версию тулкита / библиотеки / компилятора.
  • Перед тем как задать вопрос, сформулируйте его правильно, чтобы вас могли понять.
  • Нарушение Правил может повлечь наказание со стороны модераторов.


Полезные ссылки:
user posted image Boost по-русски
user posted image Qt по-русски
Модераторы: archimed7592
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> [QT] Синхронизация потоков , рызрыв мозга, помогите советом
    он не должен ждать, а должен был обработать последний пакет.
      Цитата rastoman @
      Проблема в том, что поток чего-то ждет на wait, хотя на самом деле в очереди есть один пакет!


      Всё вышесказанное мной не имеет отношения к реальности, ибо проблема была сформулирована двусмысленно.
      Реально никакого дедлока таки и нет. А я тут уже проявил чудеса кодоанализа :)

      Добавлено
      Цитата rastoman @
      ты, кстати, не правильно понял проблему!!
      у человека не дед-лок, а один не обработанный пакет в очереди зависает!!!


      Ты был прав, извините за отсебятину :)
        я считаю что рабочий поток стоит на вейте, потому что wakeAll был вызован до того, как рабочий поток встал не этом wait.
          Цитата sploid @
          я считаю что рабочий поток стоит на вейте, потому что wakeAll был вызован до того, как рабочий поток встал не этом wait.


          Согласен. +1

          Добавлено
          Прдлагаю вместо m_Condition.wait(&m_Mutex); написать m_Condition.wait(&m_Mutex, 200); :)
          Кривенько, но лучше чем Sleep(1) и спасёт с задержкой в 200 мс :)
            rastoman
            это самое простое и нормальное решение кажись из заданной проблемы.
              Надо исп. дополнительную bool переменную, это предотвратит зависание данных в буфере,
              когда wake() в потоке Producer был вызван до того, как поток Consumer перешел в режим ожидания:

              ExpandedWrap disabled
                bool notified = false;
                 
                // Consumer
                mutex.lock();
                if(notified)
                {
                  notified = false;
                }
                else
                {
                  waitCondition.wait(&mutex);
                }
                 
                mutex.unlock();
                 
                // Producer
                mutex.lock();
                notified = true;
                mutex.unlock();
                waitCondition.wakeOne();
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0238 ]   [ 16 queries used ]   [ Generated: 28.03.24, 10:21 GMT ]