2015-09-28 7 views
7

मेरे अनुभव से, ऐसा लगता है किक्या std :: thread :: id प्रक्रियाओं में अद्वितीय है?

std::this_thread::get_id() 

का परिणाम प्रक्रिया भर में अद्वितीय है: आईडी एक से दूसरे प्रक्रिया से अलग हैं।

क्या यह मानक द्वारा गारंटीकृत है?

+0

क्या आप विशेष रूप से लिनक्स पर या सामान्य रूप से सी ++ के लिए जीसीसी के लिए पूछ रहे हैं? जवाब अलग दिखते हैं। – nwp

+0

मेरा प्रश्न सामान्य रूप से सी ++ मानक के बारे में है। मैं सभी प्लेटफार्मों और सभी कंपाइलरों पर एक उत्तर की तलाश में हूं। –

+5

मानक में "प्रक्रिया" की कोई अवधारणा नहीं है, कोई भी धारणा है कि कई प्रोग्राम एक साथ चल सकते हैं और बातचीत कर सकते हैं। तो प्रश्न मानक शर्तों में भी तैयार नहीं किया जा सकता है, अकेले जवाब दें। आप सभी पूछ सकते हैं "एक सामान्य कार्यान्वयन क्या करेगा?" –

उत्तर

1

std :: धागा pthreads को समर्थन देने वाले वातावरण में pthreads के शीर्ष पर लागू किया गया है। तो यह कोई (पोर्टेबल) गारंटी नहीं है।

थ्रेड ID केवल तभी एक प्रक्रिया के भीतर अद्वितीय होने की गारंटी रहे हैं:

pthread_self पुस्तिका से

। एक
टर्मिनल थ्रेड में शामिल होने के बाद थ्रेड आईडी का पुन: उपयोग किया जा सकता है, या एक अलग थ्रेड समाप्त हो गया है।

+3

यह सी ++ मानक की आवश्यकता के सवाल का उत्तर नहीं देता है, इसका मतलब यह है कि यदि सी ++ मानक को थ्रेड आईडी को प्रक्रियाओं में अद्वितीय होने की आवश्यकता होती है, तो कार्यान्वयन केवल पर्थ्रेड आईडी का पुन: उपयोग नहीं कर सकता है। (लेकिन यह संभव है कि C++ मानक को प्रक्रियाओं में अद्वितीय होने के लिए थ्रेड आईडी की आवश्यकता नहीं है।) – hvd

+0

@hvd yes, लेकिन std :: धागा pthreads को समर्थन देने वाले वातावरण में pthreads के शीर्ष पर लागू किया गया है। तो यह कोई (पोर्टेबल) गारंटी नहीं है। – PSIAlt

+2

क्या आप क्लैम के लिए एक स्रोत जोड़ सकते हैं कि 'std :: thread' जहां उपलब्ध है वहां pthreads के शीर्ष पर लागू किया गया है? मैं मानक की कल्पना नहीं कर सकता मानक की आवश्यकता है।मुझे यह भी यकीन है कि विंडोज एक counterexample है, क्योंकि pthreads उपलब्ध हैं और 'std :: thread' को लागू करने के लिए उपयोग नहीं किए जाते हैं, वे दोनों इसके बजाय देशी WinApi कार्यान्वयन का उपयोग करते हैं। लेकिन फिर यह पहली बार नहीं होगा कि माइक्रोसॉफ्ट मानक अनुपालन नहीं है। – nwp

2

मानक अनुदान कि थ्रेड आईडी विभिन्न धागे में अद्वितीय हैं, यह भी कहता है कि समाप्त थ्रेड आईडी का पुन: उपयोग किया जा सकता है। यह प्रक्रियाओं को निर्दिष्ट नहीं करता है, और उनके अस्तित्व को स्वीकार नहीं करता है, इसलिए, यह प्रक्रियाओं में विशिष्टता की गारंटी नहीं देता है।

30.3.1.1

  1. प्रकार धागे की एक वस्तु :: आईडी निष्पादन के प्रत्येक धागा और सभी धागे के लिए एक एकल अलग मूल्य के लिए एक अद्वितीय अभिज्ञापक प्रदान करता वस्तुओं कि निष्पादन की एक धागा का प्रतिनिधित्व नहीं करते (30.3.1)। निष्पादन के प्रत्येक थ्रेड में एक संबंधित थ्रेड :: आईडी ऑब्जेक्ट है जो थ्रेड :: आईडी ऑब्जेक्ट निष्पादन के किसी अन्य थ्रेड के बराबर नहीं है और यह किसी भी std :: thread के थ्रेड :: id ऑब्जेक्ट के बराबर नहीं है ऑब्जेक्ट जो निष्पादन के धागे का प्रतिनिधित्व नहीं करता है।
  2. थ्रेड :: आईडी एक छोटी प्रतिलिपि योग्य वर्ग (क्लॉज 9) होगी। लाइब्रेरी एक समाप्त थ्रेड के थ्रेड :: आईडी के मान का पुन: उपयोग कर सकती है जो अब शामिल नहीं हो सकती है।

मानक भी एक धागा :: आईडी के कार्यान्वयन दूर छुपाता है, यह एक पूर्णांक या कुछ और हो सकता है।

संबंधित मुद्दे