2015-06-06 8 views
5

Ein einfaches Programm ist: Ich möchte die Thread-ID der beiden Threads mit dieser Gettid-Funktion erhalten. Ich möchte den sysCall nicht direkt machen. Ich möchte diese Funktion verwenden.C++ gettid() wurde in diesem Bereich nicht deklariert

#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(); 
} 

Es gibt Fehler beim Kompilieren; Die Verwendung von gettid() wurde nach dem Mann Seite getan:

$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(); 

Antwort

2

Der Mann-Seite finden Sie können online here gelesen werden. Darin heißt es eindeutig:

Hinweis: Es gibt keinen glibc-Wrapper für diesen Systemaufruf; Siehe ANMERKUNGEN.

und

NOTES

Glibc nicht einen Wrapper für diesen Systemaufruf zur Verfügung stellen; Rufen Sie es mit syscall (2) auf.

Die Thread-ID, die von diesem Aufruf zurückgegeben wird, ist nicht dasselbe wie eine POSIX-Thread-ID (d. H. Der von pthread_self (3) zurückgegebene undurchsichtige Wert).

So können Sie nicht. Die einzige Möglichkeit, diese Funktion zu verwenden, ist der syscall.

Aber Sie sollten wahrscheinlich nicht sowieso. Sie können stattdessen pthread_self() (und vergleichen Sie mit pthread_equal(t1, t2)) verwenden. Es ist möglich, dass boost::thread auch eine eigene Entsprechung hat.

+3

Es gibt nichts "klar gesagt" zu sagen "es gibt keine glibc wrapper". –

13

Dies ist ein dummer Glibc-Bug. Umgehen Sie es wie folgt:

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