2013-11-14 4 views
0

Я пытаюсь написать программу 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, где они ждут, чтобы их создавали?

(я могу получить более конкретно с программой или структуры, если вы думаете, что нужно ...)

ответ

0

я получаю код ошибки 11

EAGAIN Это на Linux.

Есть ли способ/метод, который я могу контролировать/управлять количеством активных потоков и стойло некоторые темы, пока некоторые другие не закончится,

Конечно: создать глобальный счетчик потоков и переменной условия. Любой новый поток увеличивает счетчик (под мьютексом). Когда счетчик должен превысить некоторый предел, не создавайте никаких новых потоков, но ждите при условии. Выход из потоков должен уменьшать счетчик и состояние сигнала.

Это, скорее всего, не решит вашу проблему, хотя из-за рекурсивного характера вашей проблемы (вы попадете в тупик, когда все потоки должны создать дополнительные потоки, прежде чем они смогут выйти, но вы не в доступном потоке).

Лучшим решением является создание рабочей очереди и пула потоков. Любой поток из пула собирает следующий рабочий элемент из очереди, когда он доступен, и добавляет новые рабочие элементы в конец очереди.

+0

большое спасибо. На самом деле, я вроде как думал создать такую ​​же рабочую очередь, о которой вы говорите, но у меня проблемы с использованием wait/signal cond .. когда я посылаю сигнал? и при каком условии «рабочая очередь» ждет? , если это не слишком много для вас, я был бы признателен, если бы я показал, где поставить этот сигнал и ждать команд .. спасибо заранее! : D –

Смежные вопросы