Обычный способ (по крайней мере в pthreads):
- У вас есть несколько
pthread_t
ссылок на запущенные потоки. - Вместо цикла
while
вконец, вы ждете, пока все они завершатся с чем-то похожим на pthread_join(threadX, NULL);
, для всех потоков.
В вашем случае я не вижу API для получения потоков, но один разВы получаете доступ к выполняющимся потокам (возможно, запрашивая sc
в некотором роде), код будет аналогичным.
EDIT :
Если вы просто хотите подождатьдля условия легко с условными переменными.Предположим, у вас есть эти:
pthread_mutex_t end_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t condition_var = PTHREAD_COND_INITIALIZER;
bool all_threads_done = false; // Signals that all the threads are finalized
Затем в вашем main()
вы можете ожидать его с помощью:
pthread_mutex_lock( &end_mutex );
while (!all_threads_done)
pthread_cond_wait( &condition_var, &end_mutex );
wait
освободит мьютекс во время ожидания.Затем в каждом потоке вы должны иметь следующее:
// Do whatever the thread has to do...
// ...
// and then, at the end...
pthread_mutex_lock( &end_mutex );
if (no_more_threads()) // You have to figure this thing out to ensure no more threads
all_threads_done = true;
pthread_cond_signal( &condition_var );
pthread_mutex_unlock( &end_mutex );
Обратите внимание, наконец, что даже когда вы делаете while
, это не занятое ожидание, так как большинствовремя, когда главный поток ожидает в pthread_cond_wait
, и пробуждается как раз тогда, когда какой-либо из потоков заканчивается.