2011-08-12 3 views
5

내가 간단한 멀티 스레드 프로그램을 실행하려고하고 내가 GCC로부터는 pthread_create에서리턴 코드는 11

리턴 코드()입니다이 오류를 얻고 11

방법 이 문제를 해결합니까?

#include <pthread.h>        
#include <stdio.h>       
#include <stdlib.h>       

#define NUM_THREADS  20000       

void *PrintHello(void *threadid)        
{       
    long tid;        
    tid = (long)threadid;        
    printf("Hello World! It's me, thread #%ld!\n", tid);       
    pthread_exit(NULL);       
}       

int main (int argc, char *argv[])       
{       
    pthread_t threads[NUM_THREADS];       
    int rc;       
    long t;       
    for(t=0; t<NUM_THREADS; t++){        
     printf("In main: creating thread %ld\n", t);       
     rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);        
     if (rc){       
     printf("ERROR; return code from pthread_create() is %d\n", rc);        
     exit(-1);       
     }       
    }        

    /* Last thing that main() should do */       
    pthread_exit(NULL);       
}       
+0

20000 개의 스레드로 무엇을 하시겠습니까? 클러스터에 있습니까? – RedX

+1

높은 스레드 수를 시작하려면 기본 스레드 스택 크기를 변경해야합니다. – osgx

+0

osgx가 말한 바. 'pthread_attr_setstacksize'를보십시오. –

답변

14

글쎄, 실제로 오류의 의미를 파악하는 것으로 시작할 수 있습니다. thisthis에 따르면 (다른 리소스는 동일한 정보를 알려주며, 이는 단지 예일뿐입니다) 숫자 11은 EAGAIN을 의미하고 "다시 말해서 시스템에 다른 리소스를 만들지 못했습니다. 프로세스 PTHREAD_THREADS_MAX의 총 스레드 수를 초과했습니다. "

20.000 (!) 스레드를 만들려고한다는 사실과 일치합니다. 스레드를 적게 생성하거나 스레드가 완료 될 때까지 기다렸다가 새 스레드를 시작하십시오.

만들 수있는 스레드의 최대 수는 시스템에 따라 다르며 (다른 설정에 따라 다를 수도 있음) 유의하십시오. 당신이 정말로 알고 싶다면 "PTHREAD_THREADS_MAX를 찾는 방법"을위한 구글.

그러나 이것은 단지 주위를 돌보는 (또는 심지어 어쩌면) 간단한 예제가 아니면 thread pools and queues의 개념을 조사하는 것이 좋습니다.

+0

오류 코드를 메시지, 문자열 등으로 변환하는 함수가 있습니까? – LazerSharks

+0

@Gnuey http://stackoverflow.com/questions/503878/how-to-know-what-the-errno-means를 참조하십시오. –