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

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

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: Правильное использование многопоточности  (Прочитано 25094 раз)
egorsmkv
Гость
« Ответ #30 : Январь 29, 2016, 17:56 »

В коде он используется для ожидания команды "Возобновить работу потоков":

https://github.com/egorsmkv/qt-multithreading/blob/master/worker.cpp#L28
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #31 : Январь 29, 2016, 17:59 »

В коде он используется для ожидания команды "Возобновить работу потоков":

https://github.com/egorsmkv/qt-multithreading/blob/master/worker.cpp#L28
Я дописал предыдущий пост... Если вам нужна пауза, то условная переменная для этого подходит.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #32 : Январь 30, 2016, 08:32 »

Мьютекс для pause?
Да, иначе
Код
C++ (Qt)
void Worker::task() {
 forever {
   // pause block
   sync.lock();
   if (pause.load()) {
     // <- пробой здесь
     qDebug() << "Task[" << QThread::currentThreadId() << "] paused";
     cond.wait(&sync);
   }
   sync.unlock();
 

Вместо QWaitCondition что лучше использовать?
QSemaphore
« Последнее редактирование: Январь 30, 2016, 08:34 от Igors » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #33 : Январь 30, 2016, 10:25 »

QSemaphore
IMHO, не очень он для организации паузы подходит.
Записан
egorsmkv
Гость
« Ответ #34 : Январь 30, 2016, 19:42 »

Вместо QWaitCondition что лучше использовать?
Это зависит от того, что хотим получить. Улыбающийся
Если вам нужна эта пауза, то условная переменная для этого подходит.

А ожидание, циклом?

Или :

forever {
  if (pause)
    continue;

// .. do work
}
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #35 : Январь 30, 2016, 19:45 »

А ожидание, циклом?
Вы какое ожидание имеете ввиду - во время паузы? Тогда нитка заснет на wait и будет спать пока состояние флага pause не изменится.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #36 : Январь 31, 2016, 07:07 »

А ожидание, циклом?

Или :

forever {
  if (pause)
    continue;

// .. do work
}
Эдак Вы напрасно жжете процессор. Возможно Вы имели ввиду
Код
C++ (Qt)
 
while (pause)
 msleep(delay_,sec);
 
Не очень аккуратно - зато очень просто  Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #37 : Январь 31, 2016, 10:54 »

Не очень аккуратно - зато очень просто  Улыбающийся
Это "не очень аккуратно" только для лабораторок, а вообще это не приемлемо. Улыбающийся
Записан
Bepec
Гость
« Ответ #38 : Январь 31, 2016, 11:23 »

Самый просто пример - многопоточное копирование файлов. Захотел пользователь - нажал кнопочку пауза. Захотел - отжал.

И да, других вариантов кроме как слипить поток я не вижу.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #39 : Январь 31, 2016, 11:29 »

Это "не очень аккуратно" только для лабораторок, а вообще это не приемлемо. Улыбающийся
Да, не очень солидно Улыбающийся Но все же такое решение намного лучше захвата мутекса в рабочей ф-ции. Это сталкивает рабочие нитки лбами, при малом кластере все сожжется на мутексе. Разве что задача - доли секунды, тогда проходит все что угодно.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #40 : Январь 31, 2016, 11:33 »

Да, не очень солидно Улыбающийся Но все же такое решение намного лучше захвата мутекса в рабочей ф-ции. Это сталкивает рабочие нитки лбами, при малом кластере все сожжется на мутексе. Разве что задача - доли секунды, тогда проходит все что угодно.
Не очень понял про мутексы в рабочих функциях. При паузе нитка должна спать, например на wait условной переменной.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #41 : Январь 31, 2016, 12:24 »

Не очень понял про мутексы в рабочих функциях. При паузе нитка должна спать, например на wait условной переменной.
Шо тут понимать  Непонимающий
Код
C++ (Qt)
void Worker::task() {
 forever {
   // pause block
   sync.lock();
   ...
   cond.wait(&sync);
Все рабочие нитки будут пытаться захватить один и тот же мутекс - и на каждом расчете. Это очень плохо
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #42 : Январь 31, 2016, 12:57 »

Вы про шутейный пример с паузой?
Да, будет честно работать мьютиксы, но, по мне, это лучше чем атомики и sleep. Тогда уж атомики и yield.
« Последнее редактирование: Январь 31, 2016, 13:04 от Old » Записан
egorsmkv
Гость
« Ответ #43 : Март 23, 2016, 14:12 »

Вот архив проекта с github
Записан
vebmaster
Новичок

Offline Offline

Сообщений: 47


Просмотр профиля
« Ответ #44 : Февраль 02, 2017, 17:30 »

Вот архив проекта с github
Работает, спасибо!
« Последнее редактирование: Февраль 02, 2017, 22:45 от vebmaster » Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


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