2008-09-27 9 views

उत्तर

11

यदि आप सीआरटी के multithreaded संस्करण का उपयोग करते हैं, तो सभी कार्य थ्रेड सुरक्षित हैं, क्योंकि कोई भी थ्रेड-विशिष्ट जानकारी TLS में संग्रहीत है। rand_s वास्तव में पहले स्थान पर राज्य की जानकारी का उपयोग नहीं करता है, क्योंकि यह केवल ओएस एपीआई को कॉल करता है, इसलिए थ्रेड-सुरक्षा का सवाल rand_s के लिए उत्पन्न नहीं होता है। रैंड(), हालांकि एक यादृच्छिक संख्या उत्पन्न करने के लिए बीज मूल्य पर निर्भर करता है।

-2

मैं किसी भी कारण से नहीं सोच सकता कि क्यों rand_s() या यहां तक ​​कि rand() थ्रेड सुरक्षित नहीं होगा।

+0

ठीक है, लेकिन यह अभी भी एक अटकलें है। उदाहरण के लिए रैंड() अपने मौजूदा बीज को सभी धागे द्वारा साझा किए गए चर में संग्रहीत करता है ... और पॉज़िक्स में ऐसे विशेष कार्य होते हैं जिन्हें धागे के अंदर उपयोग के लिए डिज़ाइन किया गया है। –

+0

रैंड() थ्रेड-सुरक्षित नहीं है, क्योंकि स्थैतिक में इसकी आंतरिक स्थिति, जैसे कि एफजेआर ने उल्लेख किया है। हालांकि, rand_s() थ्रेड-सुरक्षित होना चाहिए। –

+0

ने आपको एक सामुदायिक उत्तर क्रिस – mmcdole

3

क्रिस ने कहा: rand() थ्रेड-सुरक्षित नहीं है क्योंकि इसकी आंतरिक स्थिति स्थैतिक है, लेकिन rand_s() थ्रेड-सुरक्षित होना चाहिए।

जेफ ने कहा कि एमएसवीसीआरटी के बहुप्रचारित संस्करण के साथ, rand() का राज्य धागा-स्थानीय भंडारण में आयोजित किया जाता है, इसलिए यह अभी भी ठीक है।

+1

के अनुसार: http://hype-free.blogspot.com/2008/05/multi-threaded-visual-c-rand.html रैंड() अपने राज्य को टीएलएस में संग्रहीत करता है, जिसका अर्थ है कि यह वीसी से थ्रेड-सुरक्षित है पर्यावरण (जो rand_s() के संबंध में विशिष्ट प्रश्न से निहित है)। –

+0

धन्यवाद, सिमुकल, और जेफ! –

2

विजुअल स्टूडियो रनटाइम लाइब्रेरी के स्रोत के साथ आता है। जबकि इनमें से कुछ के माध्यम से wade के लिए दर्दनाक हो सकता है, rand_s() बहुत सरल है।

सभी rand_s() यादृच्छिक मान प्राप्त करने के लिए ADVAPI32.DLL में SystemFunction036() को कॉल करता है। ADVAPI32.DLL में कुछ भी थ्रेड-सुरक्षित होना चाहिए।

इसके भाग के लिए, rand_s() उस फ़ंक्शन को थ्रेड-सुरक्षित तरीके से पॉइंटर प्राप्त करता है।

0

मुझे नहीं पता कि rand_s थ्रेड-सुरक्षित है, लेकिन ऐसा लगता है कि ऐसा संभवतः है, क्योंकि यह एंट्रॉपी के लिए ओएस के लिए एक राउंड-ट्रिप बनाने लगता है। (जब तक आप वीसी ++ मल्टी-थ्रेड सीआरटी से लिंक करते हैं, तो यदि आप एकल-थ्रेड से लिंक करते हैं तो सभी शर्त बंद हो जाती हैं)

यदि यह विंडोज सीआरटी द्वारा समर्थित है, तो आप rand_r पर कॉल करने का प्रयास कर सकते हैं जो पॉज़िक्स है रैंड का पुनर्वित्त संस्करण। या यहां तक ​​कि बेहतर बढ़ावा :: यादृच्छिक, यदि आप पहले ही बूस्ट का उपयोग कर रहे हैं।

पर विचार करते हुए कि व्यापक बहु-थ्रेडिंग जल्द ही कैसे होगी, किसी को भी नए कोड में रैंड() का उपयोग नहीं करना चाहिए - हमेशा rand_r/rand_s/boost/विभिन्न प्लेटफ़ॉर्म-निर्भर सुरक्षित रैंड्स/आदि का उपयोग करने का प्रयास करें।

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