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

谢谢你的帮助。

pthread_*函数返回错误代码;它们不设置CCD_ 2。(当然,他们可能会,但不会以任何记录在案的方式。)

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

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

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

如果存在线程可能使用被破坏的对象的风险,则需要停止线程,而不是分离线程。也就是说,你以某种方式向线程指示它们应该关闭,然后等待它们到达某个安全的地方,之后它们将不再接触对象。pthread_join对此很有用。

此外,现在从析构函数开始做这件事有点晚了。只有当执行析构函数的线程是唯一引用该对象的线程时,才应该运行析构函数。如果线程仍在使用该对象,那么您正在从它们下面销毁它。

最新更新