我的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
感谢您的帮助。
答案 0 :(得分:1)
pthread_*
函数返回错误代码;他们没有设置errno
。 (当然,它们可能会以任何方式记录下来。)
您的代码应打印pthread_detach
返回的值并打印出来。
Single Unix Spec记录了此函数的两个返回值:ESRCH
(找不到该ID的线程)和EINVAL
(该线程不可连接)。
在对象的析构函数中分离线程似乎很愚蠢。首先,如果它们最终会被分离,为什么不以那种方式创造它们呢?
如果线程有任何风险可以使用正在销毁的对象,则需要停止它们,而不是分离。即你以某种方式告诉线程他们应该关闭,然后等待他们到达一个安全的地方,之后他们将不再触摸对象。 pthread_join
对此很有用。
此外,从析构函数中执行此操作还有点晚。只有当执行它的线程是唯一一个引用该对象的线程时,才应运行析构函数。如果线程仍在使用该对象,那么您将从它们下面销毁它。