2011-08-12 23 views
5

ben basit çoklu iş parçacıklı programlama çalıştırmak çalışıyorum ve ben gcc gelen pthread_create gelenDönüş kodu 11

dönüş kodu() 'dir bu hatayı alıyorum olduğunu 11

nasıl Bu sorunu çözdüm mü?

#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 ip ile ne yapmak istiyorsunuz? Bir kümede misin? – RedX

+1

Yüksek sayıda iş parçacığı başlatmak için varsayılan iş parçacığı boyutunu değiştirmelisiniz. – osgx

+0

Ne osgx söyledi. Bkz. Pthread_attr_setstacksize. –

cevap

14

Hataların gerçekte ne anlama geldiğini belirlemeye başlayabilirsiniz. this ve this'a göre (diğer kaynaklar aynı bilgiyi size söyleyecektir, bu sadece bir örnektir), 11 rakamı EAGAIN anlamına gelir. Bu, sistemin başka bir iş parçacığı oluşturmak için gerekli kaynakları içermemesi anlamına gelir veya sistem tarafından uygulanan sınırdır PTHREAD_THREADS_MAX işlemindeki toplam iş parçacığı sayısı aşılacaktır. "

Bu, 20.000 (!) Ileti dizisi oluşturmaya çalıştığınız gerçeğiyle eşleşiyor. Daha az iş parçacığı oluşturun veya yeni olanlara başlamadan önce iş parçacıklarının tamamlanmasını bekleyin.

Oluşturulabilecek maksimum iş parçacığı sayısı sisteminize bağlıdır (ve hatta bazı diğer ayarlara da bağlı olabilir). Gerçekten bilmeniz gereken "PTHREAD_THREADS_MAX Nasıl Bululur" için Google.

Ancak bu thread pools and queues kavramına içine bakmak isteyebilirsiniz (belki o zaman bile ya) etrafında oynuyor sadece önemsiz bir örnektir sürece.

+0

Hata kodunu bizim için çevirecek bir işlev var mı (bir iletide, bir dizede veya herhangi bir şeyde)? – LazerSharks

+0

@Gnuey bkz http://stackoverflow.com/questions/503878/how-to-know-what-the-errno-means. –