1

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

助けてくれてありがとう。

4

1 に答える 1

1

pthread_*関数はエラー コードを返します。設定しませんerrno。(まあ、もちろんそうかもしれませんが、文書化されている方法ではありません。)

コードは、によって返された値を出力し、それを出力する必要がpthread_detachあります。

Single Unix Spec では、この関数の 2 つの戻り値が文書化されています: ESRCH(その ID のスレッドは見つかりませんでした) とEINVAL(スレッドは参加できません)。

オブジェクトのデストラクタでスレッドを切り離すのはばかげているようです。まず、最終的に分離する場合は、そのように作成しないのはなぜですか?

破棄されるオブジェクトをスレッドが使用できるリスクがある場合は、スレッドを切り離すのではなく、停止する必要があります。つまり、何らかの方法でスレッドをシャットダウンするように指示し、スレッドが安全な場所に到達するまで待機します。その後、スレッドはオブジェクトに触れなくなります。pthread_joinこれには便利です。

また、デストラクタからそれを行うのは少し遅いです。デストラクタは、それを実行するスレッドがそのオブジェクトへの参照を持つ唯一のスレッドである場合にのみ実行する必要があります。スレッドがまだオブジェクトを使用している場合は、スレッドの下から破棄しています。

于 2012-03-20T03:55:51.477 に答える