2015-06-06 20 views
5

एक साधारण प्रोग्राम है: मैं इस गेटिड फ़ंक्शन का उपयोग करके दोनों धागे की थ्रेड आईडी प्राप्त करना चाहता हूं। मैं सीधे sysCall नहीं करना चाहता। मैं इस समारोह का उपयोग करना चाहता हूँ।सी ++ गेटिड() इस दायरे में घोषित नहीं किया गया था

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

यह संकलन पर त्रुटि देता है; gettid के उपयोग() आदमी पृष्ठ के अनुसार किया गया है:

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

उत्तर

2

आदमी पेज का उल्लेख ऑनलाइन here पढ़ा जा सकता है। यह स्पष्ट रूप से कहा गया है:

नोट: इस सिस्टम कॉल के लिए कोई glibc आवरण है, टिप्पणियां देखें।

और

नोट

Glibc इस प्रणाली कॉल के लिए एक आवरण प्रदान नहीं करता है; syscall (2) का उपयोग कर इसे कॉल करें।

इस कॉल द्वारा लौटाई गई थ्रेड आईडी एक पॉज़िक्स थ्रेड आईडी (यानी, ओपेक मान pthread_self (3) द्वारा लौटाई गई चीज़ के समान नहीं है)।

तो आप नहीं कर सकते। इस समारोह का उपयोग करने का एकमात्र तरीका syscall के माध्यम से है।

लेकिन आपको शायद वैसे भी नहीं करना चाहिए। आप pthread_self() (और pthread_equal(t1, t2) का उपयोग करके तुलना करें) का उपयोग कर सकते हैं। यह संभव है कि boost::thread का अपना समकक्ष भी हो।

+3

"कोई ग्लिबैक रैपर नहीं है" कहने के बारे में "स्पष्ट रूप से कहा गया" कुछ भी नहीं है। –

13

यह एक मूर्ख ग्लिबक बग है। इस तरह के आसपास काम करें:

#include <unistd.h> 
#include <sys/syscall.h> 
#define gettid() syscall(SYS_gettid) 
संबंधित मुद्दे