2009-07-23 6 views
2

У меня есть следующий код Windows, который порождает две темы, а затем ждет, пока они не как завершены:Есть ли потоковой эквивалент WatiForMultipleObjects

hThreads[0] = _beginthread(&do_a, 0, p_args_a); 
hThreads[1] = _beginthread(&do_b, 0, p_args_b); 
WaitForMultipleObjects(2, hThreads, TRUE, INFINITE); 

Я сейчас портирования тот же код, чтобы использовать Pthreads, но не уверен, как сделать эквивалент WaitForMultipleObjects:

pthread_create(&hThreads[0], 0, &do_a, p_args_a); 
pthread_create(&hThreads[1], 0, &do_b, p_args_b); 
??? 

есть ли эквивалент способ, с помощью Pthreads, для достижения той же функциональности?

ответ

4

Если вы хотите подождать все, как вы здесь делаете, вы можете просто позвонить pthread_join() для каждого потока. Он выполнит то же самое.

pthread_create(&hThreads[0], 0, &do_a, p_args_a); 
pthread_create(&hThreads[1], 0, &do_b, p_args_b); 

pthread_join(hThreads[0], NULL); 
pthread_join(hThreads[1], NULL); 

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

+0

Мне нужно позвонить pthread_exit в do_a и do_b ли? –

+0

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

+0

Извините, я только что видел ваш комментарий. Нет, вам не нужно называть 'pthread_exit', если это не будет более удобным. Это аналогично вызову 'exit' из' main'. Вы можете сделать это, если хотите, но вы также можете просто вернуться нормально, и эффект будет таким, как если бы вы вызвали 'pthread_exit' с возвращаемым значением из функции потока. Я почти никогда не называю «pthread_exit». Я также почти никогда не использую возвращаемое значение (следовательно, почему я передаю NULL в качестве второго аргумента в 'pthread_join'). –

1

Я всегда просто использовал для цикла с pthread_join

int i; 
for(i=0;i<threads;i++) 
    pthread_join(tids[i], NULL);