Я пытаюсь написать программу C с использованием потоков POSIX, чтобы разделить квадрат на 4, а затем разделить некоторые из этих 8 снова и снова до тех пор, пока не будут выполнены некоторые условия. Так что в общем случае программа выглядит следующим образом:Избегайте ошибки phtread_create 11
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define checkResults(string, val) { \
if (val) { \
printf("Failed with %d at %s\n", val, string); \
exit(1); \
} \
}
void *editSquare(void *arg);
void divide(void *arg){
int i,rc;
Square *s = (Square *) arg;
pthread_t thr[4];
Square divs[4];
for (i=0;i<4;i++){
rc=pthread_create(&thr[i],NULL, editSquare,(void *) &divs[i]);
checkResults("pthread create",rc);
}
for (i=0;i<4;i++){
rc=pthread_join(thr[i],NULL);
checkResults(" pthread join ",rc);
}
}
void *editSquare(void *arg){
int i,rc;
Square *s = (Square *) arg;
if (!some conditions){
// do stuff
// ...
divide(s);
}
else{
//do stuff
}
}
int main(){
Square sq;
//initialize sq
divide(&sq);
return 0;
}
это может продолжаться довольно глубоко, и в какой-то момент я получаю код ошибки 11 в pthread_create .. Я понимаю, что это создает слишком много потоков для моего процессора, ведущие к ошибкам .. есть ли способ/метод, который я может управлять/управлять количеством активных потоков и останавливать некоторые потоки, пока некоторые другие не заканчиваются, и создавать их впоследствии? и вообще есть способ практически создать N потоков, которые фактически не запускаются параллельно после нескольких max_threads, но введите какую-то очередь FIFO, где они ждут, чтобы их создавали?
(я могу получить более конкретно с программой или структуры, если вы думаете, что нужно ...)
большое спасибо. На самом деле, я вроде как думал создать такую же рабочую очередь, о которой вы говорите, но у меня проблемы с использованием wait/signal cond .. когда я посылаю сигнал? и при каком условии «рабочая очередь» ждет? , если это не слишком много для вас, я был бы признателен, если бы я показал, где поставить этот сигнал и ждать команд .. спасибо заранее! : D –