从pthread create返回代码是11

时间:2017-01-04 08:21:17

标签: c++ multithreading pthreads

我使用Pthread有线程创建问题。 我认为有人可以解决问题所在。 我的代码如下。由于空间限制,我只显示了一些部分。

     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 个答案:

答案 0 :(得分: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 - 创建固定数量的线程,并在线程完成当前任务时为其分配新任务。