pthreads - как распараллелить работу - PullRequest
3 голосов
/ 18 февраля 2009

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

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

Ответы [ 3 ]

5 голосов
/ 18 февраля 2009

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

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

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

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

1 голос
/ 21 февраля 2009

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

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

1 голос
/ 18 февраля 2009

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

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

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

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

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

...