2012-03-14 161 views
1

我的pthread_detach调用失败,并显示“错误的文件描述符”错误。电话是在析构函数为我的课,并期待这样的 -pthread_detach上的错误文件描述符

if(pthread_detach(get_sensors) != 0) 
    printf("\ndetach on get_sensors failed with error %m", errno); 

if(pthread_detach(get_real_velocity) != 0) 
    printf("\ndetach on get_real_velocity failed with error %m", errno); 

使用插座时,我都永远只处理了这个错误。有什么可能导致这种情况发生在pthread_detach调用中,我应该寻找?或者它可能是线程回调中可能导致它的东西?以防万一,回调看起来像这样 -

void* Robot::get_real_velocity_thread(void* threadid) { 
    Robot* r = (Robot*)threadid; 
    r->get_real_velocity_thread_i(); 
} 

inline void Robot::get_real_velocity_thread_i() { 
    while(1) { 
     usleep(14500); 

     sensor_packet temp = get_sensor_value(REQUESTED_VELOCITY); 

     real_velocity = temp.values[0]; 
     if(temp.values[1] != -1) 
      real_velocity += temp.values[1]; 
    } //end while 
} 



/*Callback for get sensors thread*/ 
void* Robot::get_sensors_thread(void* threadid) { 
    Robot* r = (Robot*)threadid; 
    r->get_sensors_thread_i(); 
} //END GETSENSORS_THREAD 


inline void Robot::get_sensors_thread_i() { 
    while(1) { 

    usleep(14500); 

    if(sensorsstreaming) { 

     unsigned char receive; 
     int read = 0; 

     read = connection.PollComport(port, &receive, sizeof(unsigned char)); 

     if((int)receive == 19) { 

      read = connection.PollComport(port, &receive, sizeof(unsigned char)); 

      unsigned char rest[54]; 

      read = connection.PollComport(port, rest, 54); 

      /* ***SET SENSOR VALUES*** */ 
      //bump + wheel drop 
      sensor_values[0] = (int)rest[1]; 
      sensor_values[1] = -1; 
      //wall 
      sensor_values[2] = (int)rest[2]; 
      sensor_values[3] = -1; 
      ... 
      ... 
      lots more setting just like the two above 
      } //end if header == 19 
     } //end if sensors streaming 
    } //end while 
} //END GET_SENSORS_THREAD_I 

谢谢你的任何帮助。

回答

1

pthread_*函数返回一个错误代码;他们不设置errno。 (当然,他们可能,但不是以任何方式记录。)

您的代码应打印由pthread_detach返回的值并打印该值。

Single Unix Spec文件记录了该函数的两个返回值:ESRCH(没有找到该ID的线程)和EINVAL(该线程不可连接)。

在对象的析构函数中分离线程似乎很愚蠢。首先,如果他们最终会分离出来,为什么不以这种方式创造它们呢?

如果有任何线程可以使用被销毁的对象的风险,他们需要停止,而不是分离。即你以某种方式向线程表明他们应该关闭,然后等待他们到达一个安全的地方,之后他们将不再接触对象。 pthread_join对此很有用。

另外,从析构函数中做这件事有点晚。只有当执行它的线程是引用该对象的唯一线程时,才应该运行析构函数。如果线程仍在使用这个对象,那么你就在它们之下摧毁它。

+0

我希望我能在这里超过1点 - 这里有几个好点。 – 2012-03-20 04:21:12