2012-03-14 12 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によって返された値を出力し、それを出力します。

単一のUnix Specは、この関数の戻り値として、ESRCH(そのIDでスレッドが見つからない)とEINVAL(スレッドは結合可能ではない)を文書化しています。

オブジェクトのデストラクタ内のスレッドを分離するのは愚かなようです。第一に、もし彼らが最終的に切り離されるならば、それだけでそれらを作り出すのはなぜですか?

破棄されているオブジェクトをスレッドが使用するリスクがある場合は、それらを停止する必要があります。私。何らかの理由でスレッドにシャットダウンする必要があることを示してから、もう安全な場所に到達してからオブジェクトに触れないようにします。これにはpthread_joinが便利です。

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

+0

私はこれ以上1をアップヴォートすることができたらいいと思います。 –

関連する問題