![]() |
|
Модераторы: 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; |
|||
|
||||
| box |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 506 Регистрация: 27.2.2007 Репутация: нет Всего: 0 |
задача в следующем:
есть основной поток что заполняет некий контейнер std::map или std::queue , заполняет очень быстро , настолько быстро насколько позволяет одно ядро . хочу реализовать ступенчатую выборку из этого контейнера , например если размер очереди меньше N то задействуем одно ядро , в случае если размер очереди N*2 то подключаем еще один поток на обработку и т.д |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
box, погляди на стандартный примерчик. С небольшими изменениями он решит твою задачу
|
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
box, слишком общее описание. Чтобы решить задачу нормальным способом, надо знать: что за данные, откуда поступают, как потом обрабатываются и т.п. Я не зря спросил про ОС и компилятор. Решать задачу с помощью мьютексов и Ко нужно лишь тогда, когда без них никак не обойтись. Не нужно использовать примитивы когда есть конкурентные контейнеры(например эти или этот) и асинхронное программирование основанное на задачах(PPL или TBB)
|
|||
|
||||
| o2n3e |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 19.8.2011 Репутация: -4 Всего: -5 |
Модератор: Сообщение скрыто. |
|||
|
||||
| akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
А вообще вы в дебри уже полезли. Первое, что std::map небыстрый контейнер.
Если уж такая критичная задача, то лучше уж unordered_map брать или вообще какой-нибудь hash. То есть сначала надо оценить примерное количество элементов, которые могут быть, затраты времени на вставку, потом смотрите, нужен ли вам поиск только или же ещё и удаление из контейнера, опять оценка времени. Из этой оценки выбираете наиболее устраивающий вид контейнера. Да и ладно. Это сообщение отредактировал(а) akizelokro - 15.10.2013, 18:51 -------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
| Randomazer |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 20.6.2010 Репутация: нет Всего: нет |
|
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
||||
|
||||
| box |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 506 Регистрация: 27.2.2007 Репутация: нет Всего: 0 |
а поясните вчем разница в плане быстродействия между map и unordered_map . с виду такой же контейнер
|
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
map вставку/поиск за Θ(logN) делает, а unordered за Θ(1)
|
|||
|
||||
| box |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 506 Регистрация: 27.2.2007 Репутация: нет Всего: 0 |
а подробнее про алгоритм обоих можно ?
|
|||
|
||||
| box |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 506 Регистрация: 27.2.2007 Репутация: нет Всего: 0 |
за счет чего достигается такая производительность unordered_map ?
|
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
||||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Есть такое понятие, как наихудший случай.
Так вот у хеш, наихудший случай равен простому перебору, т.е Θ(N) впрочем вероятность попадания на такой случай, практически равна 0. (вероятность возрастает при неправильно подобранной хеш функции) у мап, теоретический наихудший случай - Θ(logN), как и среднестатистический. |
|||
|
||||
| box |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 506 Регистрация: 27.2.2007 Репутация: нет Всего: 0 |
да.... разница в производительности действительно существенная , пример заполнения
случайно сгенерированным ип адресом типа стринг
в секунду максимум уникальных вхождений:
в два раза быстрее хотя по сути функция одна и таже |
||||
|
|||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
за низкую вероятность приходится платить памятью, хорошо работает при 50% заполнении (а после 75% приближаемся к худшему случаю). btw обычно используются обозначения Θ(N) - в среднем (функция ограничена сверху и снизу) O(N) - в худшем (ограничена сверху) Ω(N) - в лучшем (ограничена снизу) Добавлено через 2 минуты и 47 секунд hash: Ω(1), Θ(1), O(N), память ~2*N map: Ω(1), Θ(logN), O(logN), память ~N*(1+2 указателя) |
|||
|
||||
| akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
я про то, что как вариант для улучшения быстродействия использовать один из контейнеров с hash в названии -------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
Контейнеры с hash в название это то, что в C++11 стало с unordered в названии.
|
|||
|
||||
| akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
Ну, это возможно, даже не буду искать отмазку.
А чем вообще <queue> автору не нравится? -------------------- 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. |