2016-10-31 5 views
0

EDIT: Я не могу использовать мьютекс или сна() или любой типа ожидания, как мы достаточно новые для потоков в C.Многопоточность - как остановить все потоки, если условие выполнено?

Для моего назначения я сделать BruteForce взломщик паролей с использованием темы , Идея состоит в том, что у меня есть хэш и соль пароля, поэтому я использую комбинацию алфавита A-Z, a-z, 0-9 и шифрую его с помощью функции crypt_r и сравниваю ее с хешем и солью, которую у меня есть.

Я создал 2 потока, один, который просто проверяет строчные буквы и второй, который проверяет все буквы алфавита.

Моя проблема заключается в том, что после того, как нижний регистр найдет пароль, который он дает, но второй поток продолжает работать в фоновом режиме.

Как остановить второй поток без использования каких-либо глобальных переменных?

Вот как я идти о потоке присоединяется:

for (int i = 0; i < nbThread; ++i) { 
    pthread_join(tabThread[i], NULL); 
    pthread_join(tabThread2[i], NULL); 
} 

Спасибо за ваше время и помощь!

+0

Возможный дубликат [Как остановить запущенный поток pthread?] (Http://stackoverflow.com/questions/18826853/how-to-stop-a-running-pthread-thread) –

ответ

0

У вас нет , чтобы использовать вызовы pthread_join(), если вы не хотите что-то делать после выхода нитей. Это удобная функция, а не необходимость. Вы можете разрешить выход основного потока с pthread_exit() (без каких-либо звонков pthead_join()), а остальные два потока могут продолжаться до тех пор, пока не будет выполнено одно из них. Если любой из ваших потоков найдет пароль, вы можете просто выйти (используя _exit() или _Exit()), процесс, а другой поток, естественно, будет завершен при выходе процесса.

+0

спасибо! в моем потоке я добавил «если пароль найден -> pthread_exit (NULL)», и, похоже, он работает. –

1

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

И тогда у вас есть отличный способ убить нить pthread_killl. Обратите внимание, что использование pthread_kill может привести к утечке ресурсов.

+0

Можно ли вызвать pthread_cancel в пределах нить? Я передаю структуру в мой поток, но структура не содержит указателя на поток. –

+0

@JohnLivingston Если у вас есть 'pthread_t' потока, который вы хотите отменить, вы можете его вызвать из любого места. –