2009-02-17 7 views
3

Мне нужно распараллелить простой взломщик паролей, чтобы использовать его в n-процессорной системе. Моя идея - создать n потоков и накормить их все больше и больше работы по мере их завершения.pthreads - как распараллеливать работу

Каков наилучший способ узнать, когда закончилась нить? Мьютекс? Не стоит ли проверять этот мьютекс постоянно, пока работают другие потоки?

+1

Будет ли эта n-процессорная система ботнетом Confiker, возможно? –

+0

Ухм, нет ... на данный момент, n = 2 ;-) Возможно, в будущем! – zakk

+2

Почему я получаю подозрительное подозрение, что это может быть использовано для зла? –

ответ

5

У вас может быть простая структура очереди - используйте любую структуру данных, которая вам нравится, - а затем просто используйте мьютекс, когда вы добавляете/удаляете элементы из него.

При условии, что ваши потоки захватят работу, которую им нужно сделать в достаточно больших «кусках», тогда будет очень мало споров по мьютексу, поэтому очень мало накладных расходов.

Например, если каждый поток должен захватывать приблизительно 1 секунду работы за один раз и работать независимо в течение 1 секунды, то на мьютексе будет очень мало операций.

Нитки могут выйти, когда у них больше не будет работы; основной поток мог бы ждать, используя pthread_join.

+0

ОК, я почти получил это ... последнее: что нить должна присоединиться к главной теме? даже если все подтемы имеют примерно такую ​​же работу, вы никогда не сможете сказать, что закончит сначала ... – zakk

+0

Просто присоединитесь ко всем из них в любом порядке; присоединение к уже завершенному потоку немедленно вернется. – MarkR

1

Использование очереди сообщений между потоками: -

Master -> Process (говоря идти с этим). Процесс -> Мастер (говорит, что я закончил - дайте мне больше или, я нашел результат!)

Использование этого потока только закрывается, когда система делает это - иначе это либо обработка данных, либо ожидание в очереди сообщений.

Таким образом, MCP (я всегда хотел сказать это!) Просто обрабатывает сообщения и задания для рук в потоки, которые ждут больше работы.

Это может быть более эффективно создавать и уничтожать потоки все время.

1

Обычно вы используете «переменную условия» для такого рода вещей, где вы хотите дождаться завершения асинхронного задания.

Переменные состояния в основном являются защищенными от мутекса, простыми сигналами. Pthread имеет переменные условия (см., Например, функцию pthread_cond_create (...)).

 Смежные вопросы

  • Нет связанных вопросов^_^