Russian Qt Forum
Ноябрь 22, 2024, 23:44
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Многопоточное программирование, процессы
>
Приостановить поток
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Приостановить поток (Прочитано 19267 раз)
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
Сообщений: 11445
Re: Приостановить поток
«
Ответ #1 :
Ноябрь 20, 2011, 10:36 »
1) В любом случае требуется мутекс, семафор, на худой конец - атомарный лок
2) Эти операции атомарные, но чтение+запись такой переменной нужно защищать блокировками
Записан
alexman
Гость
Re: Приостановить поток
«
Ответ #2 :
Ноябрь 20, 2011, 11:49 »
1. void QThread::sleep ( unsigned long secs )
Записан
qt_user
Гость
Re: Приостановить поток
«
Ответ #3 :
Ноябрь 20, 2011, 11:50 »
Цитата: Igors от Ноябрь 20, 2011, 10:36
1) В любом случае требуется мутекс, семафор, на худой конец - атомарный лок
а что такое атомарный лок? и еще такой вопрос - с точки зрения произовдительности что лучше:
lock() unlock() мютексом или release() aquire() семафором? в данном семафор всеравно будет использоваться
как мютекс
Записан
qt_user
Гость
Re: Приостановить поток
«
Ответ #4 :
Ноябрь 20, 2011, 11:51 »
Цитата: alexman от Ноябрь 20, 2011, 11:49
1. void QThread::sleep ( unsigned long secs )
это не пойдет, неизвестно сколько потоку нужно спать, точнее будет его определенное событие (нажатие на кнопку)
Записан
alexman
Гость
Re: Приостановить поток
«
Ответ #5 :
Ноябрь 20, 2011, 12:35 »
Ну можно уснуть на немного и проверить состояние, если состояние не выполнено, то можно снова уснуть на немного, ... пока не получим необходимое состояние.
Записан
BRE
Гость
Re: Приостановить поток
«
Ответ #6 :
Ноябрь 20, 2011, 12:56 »
Цитата: qt_user от Ноябрь 20, 2011, 00:31
1.
В общем дело таково: мне нужно приостановить выполнение потока, в принципе для этого есть условие ожидания
QWaitCondition::wait(), но эта ф-ция принимает мютекс, мне же просто хочется приостановить поток, мютексом
в холостую lock'aть unlock'ать как-то "по-быдлокодерски", есть какие-то варианты
?
А у тебя не получится в холостую локать/унлокать.
Тебе все равно потребуется какой-то "ресурс", что бы указать засыпать потоку или нет.
Записан
BRE
Гость
Re: Приостановить поток
«
Ответ #7 :
Ноябрь 20, 2011, 13:07 »
Цитата: alexman от Ноябрь 20, 2011, 12:35
Ну можно уснуть на немного и проверить состояние, если состояние не выполнено, то можно снова уснуть на немного, ... пока не получим необходимое состояние.
sleep "плохая" функция.
IMHO, почти всегда (если не всегда) можно обойтись без нее и получить более эффективный код.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Приостановить поток
«
Ответ #8 :
Ноябрь 20, 2011, 13:09 »
Цитата: qt_user от Ноябрь 20, 2011, 11:50
а что такое атомарный лок? и еще такой вопрос - с точки зрения произовдительности что лучше:
lock() unlock() мютексом или release() aquire() семафором? в данном семафор всеравно будет использоваться
как мютекс
Производительность мутекса и семафора одинакова (они сделаны на одних и тех же базовых примитивах ОС). Ну и скоростью оба не блещут. Поэтому если время останова достаточно мало (0.1 сек и меньше) то лучше атомарный лок, который не останавливает нитку (процессор работает) но позволяет продолжить выполнение когда условие достигнуто. Проще всего QAtomicInt::testAndSetAcquire
Цитата: alexman от Ноябрь 20, 2011, 12:35
Ну можно уснуть на немного и проверить состояние, если состояние не выполнено, то можно снова уснуть на немного, ... пока не получим необходимое состояние.
"Так защищаться можно", но
1) Возникают проблемы "а немного - это сколько ?"
2) Образуется неприятный "стык". Напр мы поставили условие true, а потом нужно опять false. Но неизвестно подхватила ли нитка наше true
Записан
alexman
Гость
Re: Приостановить поток
«
Ответ #9 :
Ноябрь 20, 2011, 16:04 »
Цитата: BRE от Ноябрь 20, 2011, 13:07
Цитата: alexman от Ноябрь 20, 2011, 12:35
Ну можно уснуть на немного и проверить состояние, если состояние не выполнено, то можно снова уснуть на немного, ... пока не получим необходимое состояние.
sleep "плохая" функция.
IMHO, почти всегда (если не всегда) можно обойтись без нее и получить более эффективный код.
Не могу спорить, так как сам ее не использовал.
Записан
qt_user
Гость
Re: Приостановить поток
«
Ответ #10 :
Ноябрь 20, 2011, 16:08 »
все сделал с помощью мьютекса, один поток делает lock(), а второй после условия тоже пытается lock(),
но мьютекс закрыт, после возникновения события "продолжить" главный поток делает unlock(), думаю
дальше идея ясна
Записан
alexman
Гость
Re: Приостановить поток
«
Ответ #11 :
Ноябрь 20, 2011, 16:08 »
Цитата: Igors от Ноябрь 20, 2011, 13:09
1) Возникают проблемы "а немного - это сколько ?"
2) Образуется неприятный "стык". Напр мы поставили условие true, а потом нужно опять false. Но неизвестно подхватила ли нитка наше true
1. Эмпирически
2. Это да. Ну как вариант можно конечно хранить массив значений состояния. В данной ситуации надо что-нибудь другое использовать.
«
Последнее редактирование: Ноябрь 20, 2011, 16:10 от alexman
»
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Приостановить поток
«
Ответ #12 :
Ноябрь 20, 2011, 16:25 »
Цитата: qt_user от Ноябрь 20, 2011, 16:08
все сделал с помощью мьютекса, один поток делает lock(), а второй после условия тоже пытается lock(),
но мьютекс закрыт, после возникновения события "продолжить" главный поток делает unlock(), думаю
дальше идея ясна
Так не пойдет. Правило: если нитка делает lock(), то она же (и только она) должна сделать unlock(). А если хотите делать из разных ниток - используйте семафоры
Записан
qt_user
Гость
Re: Приостановить поток
«
Ответ #13 :
Ноябрь 20, 2011, 18:09 »
Цитата: Igors от Ноябрь 20, 2011, 16:25
Так не пойдет. Правило: если нитка делает lock(), то она же (и только она) должна сделать unlock(). А если хотите делать из разных ниток - используйте семафоры
конечно переделать под семафоры не составит труда, но у меня возникает вопрос: это правило
чисто "правило хорошего стиля" или у него есть какие-то предпосылки?
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Приостановить поток
«
Ответ #14 :
Ноябрь 20, 2011, 18:15 »
Цитата: qt_user от Ноябрь 20, 2011, 18:09
это правило чисто "правило хорошего стиля" или у него есть какие-то предпосылки?
Это не имеет никакого отношения к стилю - нитка захватившая mutex (mutual exсlusion) должна его же и освободить, иначе результат не определен
По поводу "идея ясна" и "не составит труда" - "многопоточное программирование" только на первый взгляд кажется простым, но это не так
«
Последнее редактирование: Ноябрь 20, 2011, 22:54 от Igors
»
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...