pthread_detach 上的错误文件描述符

Posted

技术标签:

【中文标题】pthread_detach 上的错误文件描述符【英文标题】:Bad file descriptor on pthread_detach 【发布时间】:2012-03-14 17:37:34 【问题描述】:

我的 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(线程不可连接)。

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

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

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

【讨论】:

我希望我能投票超过 1 - 这里有几个好点。

以上是关于pthread_detach 上的错误文件描述符的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces 939 D Love Rescue

Python pthread_detach 模拟

pthread_detach(pthread_self())

存在现有连接器时的 pthread_detach 行为

暗黑2装备合成问题.拜托大家帮帮忙~! 谢谢了~!

linux下多线程之pthread_detach(pthread_self())