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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Приостановить поток  (Прочитано 19190 раз)
qt_user
Гость
« : Ноябрь 20, 2011, 00:31 »

Доброй ночи,
1. В общем дело таково: мне нужно приостановить выполнение потока, в принципе для этого есть условие ожидания
QWaitCondition::wait(), но эта ф-ция принимает мютекс, мне же просто хочется приостановить поток, мютексом
в холостую lock'aть unlock'ать как-то "по-быдлокодерски", есть какие-то варианты?

2. и еще одно: если у меня есть перечисление и переменная:
Код:
enum WorkState {run, stop, exit};
WorkState workState

эту переменную workState разделяют 2 потока:
workState = run;
if (workState == stop) {}
Вопрос: это атомарные операции?

Спасибо
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Ноябрь 20, 2011, 10:36 »

1) В любом случае требуется мутекс, семафор, на худой конец - атомарный лок

2) Эти операции атомарные, но чтение+запись такой переменной нужно защищать блокировками
Записан
alexman
Гость
« Ответ #2 : Ноябрь 20, 2011, 11:49 »

1. void QThread::sleep ( unsigned long secs )
Записан
qt_user
Гость
« Ответ #3 : Ноябрь 20, 2011, 11:50 »

1) В любом случае требуется мутекс, семафор, на худой конец - атомарный лок
а что такое атомарный лок? и еще такой вопрос - с точки зрения произовдительности что лучше:
lock() unlock() мютексом или release() aquire() семафором? в данном семафор всеравно будет использоваться
как мютекс
Записан
qt_user
Гость
« Ответ #4 : Ноябрь 20, 2011, 11:51 »

1. void QThread::sleep ( unsigned long secs )
это не пойдет, неизвестно сколько потоку нужно спать, точнее будет его определенное событие (нажатие на кнопку)
Записан
alexman
Гость
« Ответ #5 : Ноябрь 20, 2011, 12:35 »

Ну можно уснуть на немного и проверить состояние, если состояние не выполнено, то можно снова уснуть на немного, ... пока не получим необходимое состояние.
Записан
BRE
Гость
« Ответ #6 : Ноябрь 20, 2011, 12:56 »

1. В общем дело таково: мне нужно приостановить выполнение потока, в принципе для этого есть условие ожидания
QWaitCondition::wait(), но эта ф-ция принимает мютекс, мне же просто хочется приостановить поток, мютексом
в холостую lock'aть unlock'ать как-то "по-быдлокодерски", есть какие-то варианты?
А у тебя не получится в холостую локать/унлокать. Улыбающийся
Тебе все равно потребуется какой-то "ресурс", что бы указать засыпать потоку или нет.
Записан
BRE
Гость
« Ответ #7 : Ноябрь 20, 2011, 13:07 »

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

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Ноябрь 20, 2011, 13:09 »

а что такое атомарный лок? и еще такой вопрос - с точки зрения произовдительности что лучше:
lock() unlock() мютексом или release() aquire() семафором? в данном семафор всеравно будет использоваться
как мютекс
Производительность мутекса и семафора одинакова (они сделаны на одних и тех же базовых примитивах ОС). Ну и скоростью оба не блещут. Поэтому если время останова достаточно мало (0.1 сек и меньше) то лучше атомарный лок, который не останавливает нитку (процессор работает) но позволяет продолжить выполнение когда условие достигнуто. Проще всего QAtomicInt::testAndSetAcquire

Ну можно уснуть на немного и проверить состояние, если состояние не выполнено, то можно снова уснуть на немного, ... пока не получим необходимое состояние.
"Так защищаться можно", но

1) Возникают проблемы "а немного - это сколько ?"  Улыбающийся
2) Образуется неприятный "стык". Напр мы поставили условие true, а потом нужно опять false. Но неизвестно подхватила ли нитка наше true
Записан
alexman
Гость
« Ответ #9 : Ноябрь 20, 2011, 16:04 »

Ну можно уснуть на немного и проверить состояние, если состояние не выполнено, то можно снова уснуть на немного, ... пока не получим необходимое состояние.
sleep "плохая" функция. Улыбающийся
IMHO, почти всегда (если не всегда) можно обойтись без нее и получить более эффективный код.
Не могу спорить, так как сам ее не использовал.
Записан
qt_user
Гость
« Ответ #10 : Ноябрь 20, 2011, 16:08 »

все сделал с помощью мьютекса, один поток делает lock(), а второй после условия тоже пытается lock(),
но мьютекс закрыт, после возникновения события "продолжить" главный поток делает unlock(), думаю
дальше идея ясна
Записан
alexman
Гость
« Ответ #11 : Ноябрь 20, 2011, 16:08 »

1) Возникают проблемы "а немного - это сколько ?"  Улыбающийся
2) Образуется неприятный "стык". Напр мы поставили условие true, а потом нужно опять false. Но неизвестно подхватила ли нитка наше true
1. Эмпирически Улыбающийся
2. Это да. Ну как вариант можно конечно хранить массив значений состояния. В данной ситуации надо что-нибудь другое использовать.
« Последнее редактирование: Ноябрь 20, 2011, 16:10 от alexman » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Ноябрь 20, 2011, 16:25 »

все сделал с помощью мьютекса, один поток делает lock(), а второй после условия тоже пытается lock(),
но мьютекс закрыт, после возникновения события "продолжить" главный поток делает unlock(), думаю
дальше идея ясна
Так не пойдет. Правило: если нитка делает lock(), то она же (и только она) должна сделать unlock(). А если хотите делать из разных ниток - используйте семафоры
Записан
qt_user
Гость
« Ответ #13 : Ноябрь 20, 2011, 18:09 »

Так не пойдет. Правило: если нитка делает lock(), то она же (и только она) должна сделать unlock(). А если хотите делать из разных ниток - используйте семафоры
конечно переделать под семафоры не составит труда, но у меня возникает вопрос: это правило
чисто "правило хорошего стиля" или у него есть какие-то предпосылки?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Ноябрь 20, 2011, 18:15 »

это правило чисто "правило хорошего стиля" или у него есть какие-то предпосылки?
Это не имеет никакого отношения к стилю - нитка захватившая mutex (mutual exсlusion) должна его же и освободить, иначе результат не определен

По поводу "идея ясна" и "не составит труда" - "многопоточное программирование" только на первый взгляд кажется простым, но это не так  Улыбающийся
« Последнее редактирование: Ноябрь 20, 2011, 22:54 от Igors » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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