| 
| 
 | Вопрос # 6 084/ вопрос открыт / | 
 |  Доброго времени суток, уважаемые эксперты!Имеется составной вопрос:
 1. Какие будут накладные расходы при создании 10-15 потоков, по сравнению с выполнением частей кода последовательно?
 2. Как лучше организовать ожидание результата потоков?
 
|  |   Вопрос задал: Gooddy (статус: 3-ий класс)Вопрос отправлен: 18 апреля 2012, 03:16
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Вадим К Здравствуйте, Gooddy!Если потоки будут молотить числа, то создавать их больше кол-ва ядер нет смысла. Если кол-во потоков больше кол-ва ядер, то будет даже замедление.
 Если же потоки к примеру заняты тем, что скачивают что то с интернета, потом парсят и отправляют в базу, то тут может быть преимущество. В любом случае, "больше потоков" не всегда приводит к "быстрее работает". Я видел код, в котором создается сотня потоков, но работает медленно по той причине, что тело метода execute содержит один synchronyzed(some_method);. Понятно, что будть хоть 1024 процессора, работать оно быстрее не будет.
 
 Ждать несколько потоков просто - для этого есть функция WaitForMultipleObjects.
 
|  | Ответ отправил: Вадим К (статус: Академик)Время отправки: 18 апреля 2012, 10:39
 Оценка за ответ: 5
 |  
 Мини-форум вопросаВсего сообщений: 5; последнее сообщение — 19 апреля 2012, 19:10; участников в обсуждении: 3. 
|   | min@y™ (статус: Доктор наук), 18 апреля 2012, 08:07 [#1]: Цитата (Gooddy): Какие будут накладные расходы при создании 10-15 потоков А что ты подразумеваешь под накладными расходами?
 
 Цитата (Gooddy): Как лучше организовать ожидание результата потоков? Ну, дык, есть жеж OnTerminate, к примеру.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Gooddy (статус: 3-ий класс), 18 апреля 2012, 13:26 [#2]:Под накладными расходами подразумеваю создание потока и ожидание его завершения. Чисти код! Чисти код! Чисти код! |  
|   | min@y™ (статус: Доктор наук), 18 апреля 2012, 13:57 [#3]: Цитата (Gooddy): Под накладными расходами подразумеваю создание потока и ожидание его завершения.  Ну, дык, накропай тестовую прогу (оба варианта) и прикинь.
 
 Цитата (Вадим К): тело метода execute содержит один synchronyzed(some_method); Я тоже такую хрень видал. Кто-то Фаронова начитался, видать.
 Ты где пропадал-то? Я, уж, беспокоиться начал.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Вадим К (статус: Академик), 18 апреля 2012, 14:49 [#4]:Создание потока и его уничтожение не такая уж и дешевая операция. Поэтому, если нужно постоянно создавать-удалять потоки, то лучше создавать пул потоков (поток, который выполнил свою работу, не уничтожается, а помещается в "хранилище". Когда он будет нужен новый поток, он прост достается с этого "хранилища"). Также нужно понимать, что на каждый поток по умолчанию отводиться 1мегабайт памяти (если мы говорим о 32 битных системах), хотя при определенных настройках, это может быть и 512кб. Поэтому, на 32битной системе одно приложение обычно не может создать больше 4096 потоков (в реальности эта цифра в районе 700-800). А вот почему - это уже отдельный разговор.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Gooddy (статус: 3-ий класс), 19 апреля 2012, 19:10 [#5]:Вот, спасибо. Пул потоков - отличная идея. Нужно статическое количество потоков (по ядрам процессора), но без идеи пула приходилось бы создавать до 20 новых, что например на двух-ядерном процессоре было бы если даже не расточительством, то уж точно дурным тоном. 
 Как мне кажется, помимо создания и уничтожения потока, его ожидание также будет довольно требовательно к ресурсам, так что видимо правда придётся написать и узнать реальный плюс к скорости.
 Чисти код! Чисти код! Чисти код! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |