|
Вопрос # 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 новых, что например на двух-ядерном процессоре было бы если даже не расточительством, то уж точно дурным тоном.
Как мне кажется, помимо создания и уничтожения потока, его ожидание также будет довольно требовательно к ресурсам, так что видимо правда придётся написать и узнать реальный плюс к скорости.
Чисти код! Чисти код! Чисти код!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|