2015-09-28 3 views
6

एक मूर्खतापूर्ण सवाल के बिट की तरह लगता है, लेकिन यह मुझे सोच ...क्या सी मानक समय() फ़ंक्शन थ्रेड सुरक्षित है भले ही एक पूर्ण पैरामीटर प्रदान किया गया हो?

here के अनुसार

, time एक शिकायत प्रणाली पर धागा सुरक्षित होने के लिए आवश्यक है, सही है? यह आवश्यकता फ़ंक्शन के पैरामीटर के बावजूद रखती है। NULL तर्क प्रदान किए जाने पर कुछ फ़ंक्शंस सूचीबद्ध नहीं हैं, इसलिए time प्रदान नहीं किया गया है।

तो ऐसा लगता है कि किसी भी पर्याप्त POSIX अनुपालन प्रणाली को time का थ्रेड सुरक्षित कार्यान्वयन होना चाहिए।

हालांकि, क्या एक पॉज़िक्स सिस्टम time_t को उस मामले में लागू करने का विकल्प चुन सकता है जो वास्तव में इसे एक सूचक बनाता है और फिर भी अनुपालन करता है? तो यदि परिणाम को स्टोर करने के लिए एक पूर्ण पैरामीटर प्रदान किया जाता है, तो क्या इसके थ्रेड सुरक्षा पर सभी दांव बंद नहीं होंगे क्योंकि यह संभवतः कुछ स्थैतिक भंडारण के लिए सूचक लौटाएगा? या time_t के लिए कुछ आवश्यकता या सम्मेलन है कि मैं इस पहलू में लापता हूं?

time कुछ UNIX प्लेटफॉर्म पर धागा सुरक्षित है, मैं यह कैसे सत्यापित करूं? विशेष रूप से, AIX, HP-UX, Linux, और Solaris। एक डीबगर में disassembly के माध्यम से कदम काम कर सकता है, लेकिन कार्यान्वयन बदल सकते हैं।

+6

http://pubs.opengroup.org/onlinepubs/009695399/basedefs/sys/types.h.html: टाइम_टी और clock_t पूर्णांक या वास्तविक चल प्रकार होगा। उन्हें असाइन करना थ्रेड-सुरक्षित होना चाहिए। – marcolz

+0

'टाइम' एक मूर्खतापूर्ण पर्याप्त कार्य है जैसा कि है। हम संगतता कारणों के लिए अपने हस्ताक्षर को तोड़ नहीं सकते हैं, लेकिन इसे कम करने और थ्रेड-असुरक्षित कार्यान्वयन की अनुमति देने का कोई कारण नहीं था। – MSalters

+0

@marcolz धन्यवाद। यकीन नहीं है कि मैं इसे कैसे चूक गया। – Kizaru

उत्तर

4

हां यह धागा सुरक्षित है।

time_t time(NULL); 

यदि यह एक आंतरिक मूल्य लागू किया, बिंदु यह लौटे पर, यह हमेशा रिटर्न मान पर आंतरिक मूल्य से नकल करने के लिए होगा (रजिस्टर?)। वह प्रतिलिपि इसे थ्रेड-सुरक्षित बनाती है क्योंकि यह सभी आधुनिक प्रोसेसर एकल प्रति में फिट होगी।

mov eax, static_internal_value 
return 

कल्पना कीजिए कि मामला नहीं था, और 2 धागे में आया था वे दोनों बाहर की नक़ल की एक ही मूल्य -। फिर, नहीं देख सकते हैं कि यह कैसे गलत हो सकता है।

thread 1         thread 2 
              mov eax, static_internal_value 
mov eax, static_internal_value 
return 
              return 
+0

कुछ चीजें। मुझे 'time_t' के लिए पूर्णांक या फ़्लोटिंग पॉइंट प्रकार होने की आवश्यकता के बारे में पता नहीं था। यह मेरे hypothetical सूचक स्थिति बाहर फेंकता है। दूसरा, आपकी पोस्ट एक परमाणु डबल शब्द स्टोर मान रही है। जो आमतौर पर सत्य है, लेकिन x86 आर्किटेक्चर सूचीबद्ध प्लेटफ़ॉर्म का संग्रह नहीं है। 'Time_t' के लिए एक पूर्णांक या फ़्लोटिंग बिंदु होने की आवश्यकता के साथ भी, एक अनुपालन कार्यान्वयन में 8 बाइट 'time_t' हो सकता है जिसमें कुछ प्लेटफ़ॉर्म पर परमाणु लोड/स्टोर नहीं हो सकता है। POSIX spec का कहना है कि 'समय' थ्रेड सुरक्षित होना आवश्यक है, और इसलिए यह है। – Kizaru

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