2011-09-01 13 views
11

से पिड कैसे प्राप्त करें, प्रत्येक पाथ्रेड एक पिड पर मैपिंग कर रहा है, जिसे हॉप जैसे टूल में निगरानी की जा सकती है। लेकिन मैं धागे की पिड कैसे प्राप्त कर सकता हूं? getpid() बस मुख्य धागे की पिड वापस करें।आरएच लिनक्स में pthread

+0

[लिनक्स 2.6 NPTL के साथ बदल दिया LinuxThreads] (http://drdobbs.com/open-source/184406204), लिनक्स अब POSIX अनुसरण करता है और सही ढंग से प्रत्येक थ्रेड के लिए एक ही पीआईडी ​​देता है। –

+2

आपको उन उत्तरों को स्वीकार करने पर विचार करना चाहिए जिन्हें आप उपयोगी पाते हैं। –

+0

स्टीव-ओ: शायद ऐसा है, लेकिन लिनक्स अभी भी प्रत्येक थ्रेड के लिए एक अलग प्रक्रिया बनाता है (प्रत्येक थ्रेड को अपना/proc/ मिलता है, जहां मुख्य थ्रेड/प्रक्रिया से अलग है) – Rahly

उत्तर

10

pthread_self();

बुला धागे की आईडी वापस जाने के लिए कहा जा सकता है।

इसके अलावा पीआईडी ​​प्रक्रिया आईडी है, एक थ्रेड में थ्रेड आईडी नहीं है पीआईडी। एक ही प्रक्रिया में चल रहे सभी धागे एक ही पीआईडी ​​होंगे।

+13

अलस डाउनवोट इसलिए है क्योंकि आप जो कह रहे हैं वह गलत है। लिनक्स धागे वास्तव में एक पिड द्वारा प्रतिनिधित्व किया जा सकता है, क्योंकि वे हल्के प्रक्रियाएं हैं। वास्तव में निम्नलिखित कार्य Linux unistd.h में मौजूद है: pid_t gettid (शून्य)।दूसरी तरफ, विंडोज़ में स्वतंत्र स्वतंत्र धागे आईडी हैं। – ThreeBit

2

एक पीआईडी ​​एक प्रोसेस आईडी है, न कि थ्रेड आईडी। एक ही प्रक्रिया पर चल रहे धागे स्पष्ट रूप से सभी एक ही पीआईडी ​​से जुड़े होंगे।

क्योंकि pthreads पोर्टेबल होने का प्रयास करता है तो आप सीधे अंतर्निहित ओएस थ्रेड की आईडी प्राप्त नहीं कर सकते हैं। यह भी संभव है कि एक अंतर्निहित ओएस धागा नहीं है।

+0

या इसके बजाय, चूंकि एनपीटीएल धागे अब नहीं हैं प्रक्रियाओं के रूप में पंजीकृत है। –

0

मुझे लगता है कि समारोह आप देख रहे हैं pthread_self

0

धागे TIDs (threadIds) है, और सभी थ्रेड एक ही प्रक्रिया (पीआईडी) में चलाते हैं। तो, आपके धागे में सभी एक ही पिड को मानते हैं कि वे एक ही प्रक्रिया में बनाए गए हैं, तो उनके पास अलग-अलग बोलियां होंगी।

pthread_self() टिड देता है, और getpid() को पिड मिलता है।

22

दो धागे मान हैं जो भ्रमित हो जाते हैं। pthread_self() POSIX थ्रेड आईडी वापस करेगा; gettid() ओएस थ्रेड आईडी वापस कर देगा। उत्तरार्द्ध लिनक्स विशिष्ट है और पोर्टेबल होने की गारंटी नहीं है, लेकिन शायद आप वास्तव में क्या देख रहे हैं।

संपादित PlasmaHH नोटों के रूप में, gettid()syscall() के माध्यम से कहा जाता है। syscall() आदमी पृष्ठ से:

#define _GNU_SOURCE 
    #include <unistd.h> 
    #include <sys/syscall.h> 
    #include <sys/types.h> 

    int 
    main(int argc, char *argv[]) 
    { 
     pid_t tid; 

     tid = syscall(SYS_gettid); 
    } 
+0

ध्यान दें कि gettid() में कोई glibc wrapper नहीं है और syscall() – PlasmaHH

+0

@ PlasmaHH के माध्यम से कॉल करने की आवश्यकता है - ठीक है, मुझे इसे जोड़ना चाहिए। सौभाग्य से syscall मैन पेज इसे एक उदाहरण के रूप में उपयोग करता है। – Duck

+0

गेटिड() एक प्रकार का [विवादास्पद] है (http://airlied.livejournal.com/74826.html) –

1

pthread_self नहीं टीआईडी ​​प्राप्त करता है। यह pthread कार्यों में उपयोग के लिए pthread_t प्रकार के हैंडल या सूचक को साबित करता है।

एक उदाहरण के लिए यहाँ देखो क्या एक वास्तविक दुनिया कार्यक्रम वापस कर सकती है:

http://www.c-plusplus.de/forum/212807-full

1

असल pthread_self वापसी pthread_t और नहीं एक पूर्णांक धागा आईडी आप के साथ काम कर सकते हैं, तो निम्न सहायक समारोह आप में है कि मिल जाएगा विभिन्न POSIX सिस्टम भर में एक पोर्टेबल तरीका।

uint64_t gettid() { 
    pthread_t ptid = pthread_self(); 
    uint64_t threadId = 0; 
    memcpy(&threadId, &ptid, std::min(sizeof(threadId), sizeof(ptid))); 
    return threadId; 
} 
संबंधित मुद्दे