2012-03-14 163 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返回的值並打印該值。

Single Unix Spec文件記錄了該函數的兩個返回值:ESRCH(沒有找到該ID的線程)和EINVAL(該線程不可連接)。

在對象的析構函數中分離線程似乎很愚蠢。首先,如果他們最終會分離出來,爲什麼不以這種方式創造它們呢?

如果有任何線程可以使用被銷燬的對象的風險,他們需要停止,而不是分離。即你以某種方式向線程表明他們應該關閉,然後等待他們到達一個安全的地方,之後他們將不再接觸對象。 pthread_join對此很有用。

另外,從析構函數中做這件事有點晚。只有當執行它的線程是引用該對象的唯一線程時,才應該運行析構函數。如果線程仍在使用這個對象,那麼你就在它們之下摧毀它。

+0

我希望我能在這裏超過1點 - 這裏有幾個好點。 – 2012-03-20 04:21:12