crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V  < 1 2 3 >  
Ответить в данную темуНачать новую тему
> Потоконезависимые очереди, реализация
AD
  опции профиля:
сообщение 9.11.2011, 17:30
Сообщение #11


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(BRE @ 7.11.2011, 14:50) *
На соседнем форуме обсуждали. Одна из тем: http://www.prog.org.ru/index.php?topic=144...g95463#msg95463

Спасибо еще раз. Есть еще один небольшой вопрос - дополнение к тому, что я увидел на prog.org по указанной ссылке. Надо ли взводить семафор (semaphore.acquire()), если я хочу проверить очередь на пустоту (вед в основе список QList) или узнать размер очереди?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 9.11.2011, 17:45
Сообщение #12


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Не нужны там семафоры (для другого они заточены), ну да ладно. :)
И в первом и во втором случае нужно блокировать доступ к QList.

Сообщение отредактировал BRE - 9.11.2011, 17:46
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 9.11.2011, 18:19
Сообщение #13


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(BRE @ 9.11.2011, 18:45) *
Не нужны там семафоры (для другого они заточены), ну да ладно. :)

Не ладно. Буду благодарен, если раскроешь суть. И еще вопросик. Как на русский переводится термин "wait condition" (дословно-то я знаю, состояние ожидания)?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 9.11.2011, 19:05
Сообщение #14


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Чаще всего встречал перевод "условные переменные".
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 10.11.2011, 10:19
Сообщение #15


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Ага. Ну тут еще вопросы.
Смысл программы следующий: в главном потоке мы заполняем очередь запросов, в дополнительном - происходят вычисления и результаты попадают в очередь результатов. Исходя из приведенного на прог.орг примера сделал функции проверки на пустоту и размер следующими:
/// Пpoвepka на пустую очередь
bool ReqQueue::isEmpty()
{
    QMutexLocker locker(&_mtx);
    while(_req_list.isEmpty())
        _cond.wait(&_mtx, 300);

    return _req_list.isEmpty();
}

/// Pазмер очередu
int ReqQueue::size()
{
    QMutexLocker locker(&_mtx);
    while(_req_list.isEmpty())
        _cond.wait(&_mtx, 300);

    return _req_list.size();
}

Но это как-то не так. При проверке на пустоту цикл while не заканчивается. Как это поправить корректно? На сколько я понял из обсуждения на то форуме, цикл нужен, но тогда какой?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 10.11.2011, 10:26
Сообщение #16


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Не нужно ждать условную переменную. Она нужна в рабочих потоках, что бы усыпить поток на время когда нет работы.
bool ReqQueue::isEmpty()
{
    QMutexLocker locker(&_mtx);
    return _req_list.isEmpty();
}

/// Pазмер очередu
int ReqQueue::size()
{
    QMutexLocker locker(&_mtx);
    return _req_list.size();
}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 10.11.2011, 14:22
Сообщение #17


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Из главного потока запустил дополнительный. В дополнительном у меня вечный цикл (forever) - памяти жрет 50%. Есть возможность, не отменяя цикла forever сделать так, чтобы память не жралась безмерно?

С потоками уже не раз работал, но еще ни разу не использовал forever в доп. потоке, потому такие вопросы и встают.

Пока что делаю так (память жрет):
/// Запуск потока вычисления
void CalcThread::run()
{
    forever
    {
        wait(_sec * TO_MILLISEC);
        if(QueueRequests.isEmpty())
            continue;

        Request request(QueueRequests.takeRequest());
        int error_code;
        double result = doOperation(request.type_work, request.first_operand, request.second_operand, error_code);
    }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 10.11.2011, 15:27
Сообщение #18


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


"Память жрет" это ты про "процессор жрет"? :)
Что такое функция wait, как она определена?
А лучше ты все покажи. ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 10.11.2011, 15:30
Сообщение #19


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(BRE @ 10.11.2011, 16:27) *
"Память жрет" это ты про "процессор жрет"? :)
Что такое функция wait, как она определена?
А лучше ты все покажи. ;)

Да, проц жрет. wait - функция QThread. Так у меня это одна функция в Qthread. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 10.11.2011, 15:38
Сообщение #20


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


дык, в безусловном цикле крутится - потому и жрёт. любой поллинг жрёт проц.
тебе же про условные переменные говорили - вот и примени их, чтобы было условие, что в очереди что-то появилось, а в рабочем потоке - ожидание этого условия.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V  < 1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 7:40