![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| box |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 506 Регистрация: 27.2.2007 Репутация: нет Всего: 0 |
всем привет !
есть ли альтернатива while(1) для треада если он начинается с цыкла надо что бы треад не жрал все процессорное время. счетчики имеются но как запустить процесс если счетчик int > 0 ? |
|||
|
||||
| _zorn_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1076 Регистрация: 21.8.2007 Репутация: 1 Всего: 12 |
||||
|
||||
| NoviceF |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 13.3.2012 Где: Ростов-на-Дону Репутация: нет Всего: 2 |
вешай поток на переменную условия, что-то типа этих https://computing.llnl.gov/tutorials/pthrea...ditionVariables По остальной части вопроса всё аналогично обычным циклам (можно использовать for или проверку условия и break в случае невыполнения, для прерывания цикла). |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
||||
|
||||
| box |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 506 Регистрация: 27.2.2007 Репутация: нет Всего: 0 |
нет , вы не поняли , sleep не подходит ибо за время sleep может накопиться очень много пакетов которые потом прийдется разгребать , вообщем надо что бы при поступлении нового пакета один треад подавал сигнал другому и запускал while(int > 0) где int целочисленная глобальная переменная
|
|||
|
||||
| null56 |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 2 Всего: 12 |
box, тебе ответил baldina, что можно заставить спать твой while тред, а из треда, где идет обработка входящих пакетов, ты можешь сделать wake_up твоему while треду... см
будет что - то типа
есть альтернативный вариант спать на epoll, select в твоем while треде, но это возможно не твой случай |
||||||
|
|||||||
| box |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 506 Регистрация: 27.2.2007 Репутация: нет Всего: 0 |
не хочет засыпат треад , делаю так :
но проц все равно грузится под завязку |
|||
|
||||
| akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
Поменяй приоритет для потока, если ты хочешь урезать процессорное время на выполнение потока.
Это сообщение отредактировал(а) akizelokro - 14.10.2013, 16:02 -------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Решал аналогичную задачу под винду. Создавал что-то типа диспетчера задач, но он также должен был реагировать полученные оконные сообщения.
Функция MsgWaitForMultipleObjectsEx ждет таймаут ~20мс (chkTimeout) только в случае если не пришло сообщений от винды или если не произошло запланированных событий. Если что-то из этого произошло, то ожидание прерывается досрочно и начинается обработка (WaitObjHandleList - это вектор хэндлов)
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| box |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 506 Регистрация: 27.2.2007 Репутация: нет Всего: 0 |
пытаюсь расспаралелить по треадам
при компиляции выдает : error: type 'std::unique_lock<std::mutex>' does not provide a subscript operator lck[i](mtx[i]); ~~~^~ error: type 'std::unique_lock<std::mutex>' does not provide a subscript operator cv[i].wait(lck[i]); надо что бы можно было централизованно лочить/разлочить цыкл while(1) в любом из треаде Это сообщение отредактировал(а) box - 14.10.2013, 22:08 |
|||
|
||||
| akizelokro |
|
||||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
А вообще какая многопоточная модель используется? Я так понимаю, что не несколько равноценных потоков. Скорее всего, либо модель с основным потоком и несколькими второстепенными? Или конвейерная обработка?
Если модель с основным потоком и несколькими второстепенными (зависимыми), то там уже сам бог велел делать различные приоритеты выволнения потоков. Если конвейерная модель, то можно попробовать осуществлять запуск потоков из первого, начинающего конвейерную обработку. А так я смотрю у тебя уже массивы мутексов и всего прочего, в которых ты начинаешь погрязать
Это вообще-то говоря, вообще непонятно. Потому что, например ,для переключения между потоками требуется определенное время, порядка 25 чтоли миллисекунд, если я с порядком не напутал. Если за промежуток может набежать огромное количество пакетов (да не набежит, разве что в многопроцессорной системе, где каждому потоку удастся поставить в соответствие отдельный процессор) и всё это создаст громадные сложности в работе, то задача с самого начала проблематична. .в общем случае поток-обработчик элементарно захлебнётся с обработкой. Значит, надо переходить к другому варианту. Что-то навроде
Но в любом случае надо представлять архитектуру задачи. Если у тебя можно пробудить/временно остановить выполнение потока по одному условию, это одно. Если же у тебя несколько условий из разных потоков, это уже другое. Это сообщение отредактировал(а) akizelokro - 15.10.2013, 08:44 -------------------- a = a + b; b = a - b; a = a - b; |
||||
|
|||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
box, лучше напиши, что ты хочешь сделать. Конечную цель. И ОС + компилятор, которыми ты собрался решать задачу.
P.S. по-русски правильно говорить поток(ну или в крайнем случае тред), но никак не треад |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Если поток зашел в бесконечный цикл, то никакой приоритет не поможет снизить нагрузку. Такой поток загрузит ядро на 100%. Поток, который в данное время не занят, должен спать и просыпаться по некоторому условию только, когда для него есть работа. Исключение может быть сделано для кратковременной блокировки, время которой сопоставимо со временем перехода в режим ядра. В этом случае можно применить спин блокировку. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
А в чём теологическая разница между бесконечным и конечным достаточно длинным по времени выполнения циклом? И там, и там похожий код. Или в чем разница между бесконечным циклом и возвратом по какой-то метке? Я, может быть, чего-то не дорубаю, но переключение между потоками происходит вне зависимости от того, допустил ли программист бесконечное зацикливание внутри какого-то из потоков. И любая задача сама по себе поток (ну, процесс со своим адресным пространством), так все примерно представляют, что в этом случае означает бесконечный цикл. -------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
| akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
Я вообще не уверен, что автор темы чётко подразделяет нагрузку, создаваемую отдельным потоком и создаваемую нагрузку всем процессом со всеми его потоками
-------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |