Я бы посоветовал не возродить темы, это довольно серьезные накладные расходы.Вместо этого создайте пул из N потоков и отправьте им работу через рабочую очередь - довольно стандартный подход.Даже если ваша оставшаяся работа меньше N, дополнительные потоки не принесут никакого вреда, они просто останутся заблокированными в рабочей очереди.
Если вы настаиваете на своем текущем подходе, вы можете сделать это следующим образом.:
Не ждите потоков с pthread_join
, вам это не нужно, поскольку вы ничего не возвращаете в основной поток.Создайте потоки с атрибутом PTHREAD_CREATE_DETACHED
и просто дайте им выйти.
В главном потоке подождите семафор, который сигнализируется каждым выходящим потоком - фактически вы ожидаете any завершение потока.Если по какой-либо причине у вас нет <semaphore.h>
, реализовать его с мьютексами и условиями тривиально.
#include <semaphore.h>
#include <iostream>
#include <pthread.h>
#include <cstdlib>
sem_t exit_sem;
void *find_num(void* arg)
{
double num = rand();
for(double q=0; 1; q++)
if(num == q)
{
std::cout << "\n--";
return 0;
}
/* Tell the main thread we have exited. */
sem_post (&exit_sem);
return NULL;
}
int main ()
{
srand(0);
/* Initialize pocess private semaphore with 0 initial count. */
sem_init (&exit_sem, 0, 0);
const int N = 2;
pthread_attr_t attr;
pthread_attr_init (&attr);
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
for(int q=0; q<N; q++)
pthread_create(NULL, &attr, find_num, NULL);
int M = 30;
int launched=N;
int finnished=0;
while(1)
{
for(int w=0; w<N; w++)
{
/* Wait for any thread to exit, don't care which. */
sem_wait (&exit_sem);
finnished++;
std::cout << "\n" << finnished;
if(finnished == M)
break;
if(launched < M)
{
pthread_create(NULL, &attr, find_num, NULL);
launched++;
}
}
if(finnished == M)
break;
}
}
В любом случае, я бы снова рекомендовал подход с использованием пула потоков / очереди работ.