2017-01-04 8 views
1

У меня проблема с созданием потоков с помощью Pthread. Я думаю, что кто-то может справиться с проблемой. Мой код выглядит следующим образом. Я показываю только часть из-за ограничения пространства.Возврат кода из pthread create is 11

 Main.c create Detectdirection instance and send to the function. 

    d = new Detectdirection();  
    while(run) 
    {     
     int ret = d->run_parallel(d); 
     if(ret == -1) 
      run = false; 
    } 

My Detectdirection Class имеет две функции для параллельной работы.

class Detectdirection{ 
    public: 
     int run_parallel(void*p); 
     void *Tracking(void *p); 
     static void *Tracking_helper(void * p); 
     void *ReadImage(void *p); 
     static void *ReadImage_helper(void *p); 
    private: 
     pthread_t thread[2]; 


} 
void *Detectdirection::ReadImage(void *p){ 
    Detectdirection *app = (Detectdirection*)p; 
    while(run){ 

    } 
    pthread_exit(NULL); 
} 
void *Detectdirection::Tracking(void *p){ 
    Detectdirection *app = (Detectdirection*)p; 
    while(run){ 

    } 
    pthread_exit(NULL); 
} 

void *Detectdirection::Tracking_helper(void *p){ 
    Detectdirection *app = (Detectdirection*)p; 
    return ((Detectdirection*)p)->Tracking(app); 
} 
void *Detectdirection::ReadImage_helper(void *p){ 
    Detectdirection *app = (Detectdirection*)p; 
    return ((Detectdirection*)p)->ReadImage(app); 
} 
int Detectdirection::run_parallel(void* p){ 
      Detectdirection *app = (Detectdirection*)p; 
     int rc = pthread_create(&thread[0], NULL, app->ReadImage_helper, app); 
     if (rc) { 
     printf("ERROR; return code from pthread_create() is %d\n", rc); 
     return -1; 
     } 

     rc = pthread_create(&thread[1], NULL, app->Tracking_helper, app); 
     if (rc) { 
     printf("ERROR; return code from pthread_create() is %d\n", rc); 
     return -1; 
     } 

     return 0; 
} 

Компиляция в порядке, и когда я запустил, у меня возникла ошибка создания потока. Такой тип возвращаемого типа 11 происходит только при создании многих потоков. Но теперь я создаю только два потока, и у меня есть эта ошибка. Что может быть неправильным?

ответ

1

Я считаю, что вы получаете EAGAIN (на основе кода ошибки 11). Это (поистине) означает, что у вашей системы недостаточно ресурсов для создания потоков.

POSIX documentation говорит:

[EAGAIN] Система не хватало ресурсов, необходимых для создания другой нити или системы взимаемые ограничение на общее количество нитей в процесс, {PTHREAD_THREADS_MAX} будет превышена ,

Я не совсем уверен в следующем.

Но теперь я создаю только два потока, и у меня есть эта ошибка. Что может быть неправильным?

Здесь

while(run) 
    {     
     int ret = d->run_parallel(d); 
     if(ret == -1) 
      run = false; 
    } 

Вы создаете в цикле, и каждый вызов d->run_parallel() создает два потока. Таким образом, вы потенциально создаете бесконечное число потоков , поскольку цикл прерывается только тогда, когда pthread_create() не работает. Таким образом, вы можете захотеть внимательно изучить этот цикл, действительно ли вы хотите, как сейчас.

Вы, кажется, не присоединиться с нитями вы создаете. Итак, вы могли бы отсоединить потоки, чтобы потоки, зависящие от потока, были немедленно выпущены при выходе потока. Вы можете сделать:

pthread_detach(pthread_self()); 

в обоих ReadImage_helper() и Tracking_helper() функций, чтобы отделить их. Это может потенциально решить вашу проблему с ресурсами.

Если он все еще присутствует, вам необходимо посмотреть, как ограничить количество потоков, которые одновременно работают в вашей системе. Один из возможных вариантов - использовать thread pools - создать фиксированное количество потоков и назначить им новые задачи, так как потоки завершат их текущие задачи.

+0

Да, у меня есть ошибка в Main, и я не должен использовать цикл while. Это создаст много потоков. – batuman