2015-06-06 18 views
5

Un semplice programma è: Vorrei ottenere l'ID di thread di entrambi i thread utilizzando questa funzione di gid. Non voglio fare direttamente il sysCall. Voglio usare questa funzione.C++ gettid() non è stato dichiarato in questo ambito

#include <iostream> 
#include <boost/thread/thread.hpp> 
#include <boost/date_time/date.hpp> 
#include <unistd.h> 
#include <sys/types.h> 
using namespace boost; 
using namespace std; 

boost::thread thread_obj; 
boost::thread thread_obj1; 

void func(void) 
{ 
    char x; 
    cout << "enter y to interrupt" << endl; 
    cin >> x; 
    pid_t tid = gettid(); 
    cout << "tid:" << tid << endl; 
    if (x == 'y') { 
     cout << "x = 'y'" << endl;  
     cout << "thread interrupt" << endl; 
    } 
} 

void real_main() { 

    cout << "real main thread" << endl; 
    pid_t tid = gettid(); 
    cout << "tid:" << tid << endl; 

    boost::system_time const timeout = boost::get_system_time() + boost::posix_time::seconds(3); 
    try { 
     boost::this_thread::sleep(timeout); 
    } 
    catch (boost::thread_interrupted &) { 
     cout << "thread interrupted" << endl; 
    } 

} 

int main() 
{ 
    thread_obj1 = boost::thread(&func); 
    thread_obj = boost::thread(&real_main); 
    thread_obj.join(); 
} 

Fornisce Errore durante la compilazione; L'uso di gettid() è stata effettuata secondo la pagina man:

$g++ -std=c++11 -o Intrpt Interrupt.cpp -lboost_system -lboost_thread 
Interrupt.cpp: In function ‘void func()’: 
Interrupt.cpp:17:25: error: ‘gettid’ was not declared in this scope 
     pid_t tid = gettid(); 

risposta

2

La pagina man si fa riferimento può essere letto on-line here. Si afferma chiaramente:

Nota: Non v'è alcun involucro glibc per questa chiamata di sistema; vedere le note.

e

NOTE

Glibc non fornisce un involucro per questa chiamata di sistema; chiamalo usando syscall (2).

L'ID di thread restituito da questa chiamata non è la stessa cosa di un ID di thread POSIX (ad esempio, il valore opaco restituito da pthread_self (3)).

Quindi non è possibile. L'unico modo per usare questa funzione è attraverso il syscall.

Ma probabilmente non dovresti comunque. È possibile utilizzare pthread_self() (e confrontare utilizzando pthread_equal(t1, t2)). È possibile che anche boost::thread abbia il suo equivalente.

+3

Non c'è nulla di "affermato chiaramente" sul dire "non c'è un wrapper glibc". –

13

Questo è un insetto bug di glibc. Intorno a esso in questo modo:

#include <unistd.h> 
#include <sys/syscall.h> 
#define gettid() syscall(SYS_gettid) 
Problemi correlati