2015-06-06 45 views
5

Prosty program to: Chciałbym uzyskać identyfikator wątku obu wątków za pomocą tej funkcji gettid. Nie chcę robić bezpośrednio sysCall. Chcę korzystać z tej funkcji.C++ gettid() nie został zadeklarowany w tym zakresie

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

Daje błąd podczas kompilacji; Zastosowanie gettid() zostały wykonane zgodnie ze strony człowieka:

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

Odpowiedz

2

Strona człowiek, którego dotyczą można czytać online here. Wyraźnie stwierdza:

Uwaga: Nie ma wrapper glibc dla tego wywołania systemowego; Zobacz notatki.

i

UWAGI

Glibc nie zapewnia otoki dla tego wywołania systemowego; wywołaj go przy pomocy syscall (2).

Identyfikator wątku zwróconego przez to wywołanie to nie to samo co identyfikator wątku POSIX (tj. Wartość nieprzezroczysta zwrócona przez pthread_self (3)).

Więc nie możesz. Jedynym sposobem użycia tej funkcji jest syscall.

Ale prawdopodobnie nie powinno tak. Możesz użyć numeru pthread_self() (i porównaj używając pthread_equal(t1, t2)). Możliwe, że boost::thread ma również swój własny odpowiednik.

+3

Nie ma nic "wyraźnie powiedziane" na temat powiedzenia "nie ma opakowania glibc". –

13

To jest głupi błąd w glibc. Poruszaj się tak:

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