सी ++ में 11 नए रैंडम नंबर जनरेटर इंजन और वितरण कार्यों का एक गुच्छा है। क्या वे धागे सुरक्षित हैं? यदि आप एकाधिक धागे के बीच एक एकल यादृच्छिक वितरण और इंजन साझा करते हैं, तो यह सुरक्षित है और क्या आपको अभी भी यादृच्छिक संख्याएं मिलेंगी? परिदृश्य मैं देख रहा हूँ की तरह कुछ,सी ++ 11 यादृच्छिक संख्या जनरेटर की थ्रेड सुरक्षा
void foo() {
std::mt19937_64 engine(static_cast<uint64_t> (system_clock::to_time_t(system_clock::now())));
std::uniform_real_distribution<double> zeroToOne(0.0, 1.0);
#pragma omp parallel for
for (int i = 0; i < 1000; i++) {
double a = zeroToOne(engine);
}
}
OpenMP या
void foo() {
std::mt19937_64 engine(static_cast<uint64_t> (system_clock::to_time_t(system_clock::now())));
std::uniform_real_distribution<double> zeroToOne(0.0, 1.0);
dispatch_apply(1000, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(size_t i) {
double a = zeroToOne(engine);
});
}
का उपयोग कर libdispatch का उपयोग कर रहा है।
यह मूल रूप से मुझे लगा कि यह थ्रेड-सुरक्षित नहीं था। क्या वितरण ऑब्जेक्ट 'std :: uniform_real_distribution शून्यToOne (0.0, 1.0) 'राशि थ्रेड साझा करना और प्रति थ्रेड एक इंजन का उपयोग करना ठीक है? –
user1139069
@ user1139069: नहीं, सुरक्षित नहीं। यद्यपि पहली नज़र में एक वितरण ऑब्जेक्ट * आंतरिक स्थिति को बनाए रखने के बिना इंजन ऑब्जेक्ट को बस प्रत्येक कॉल को प्रतिनिधि द्वारा अपना काम कर सकता है, अगर आप इसके बारे में सोचते हैं कि एक इंजन जो पर्याप्त यादृच्छिक बिट्स नहीं बना सकता है उसे दो बार बुलाया जा सकता है। लेकिन दो बार (या एक बार) अधिक हो सकता है, इसलिए अतिरिक्त यादृच्छिक बिट्स के कैशिंग को अनुमति देना बेहतर हो सकता है। §26.5.1.6 \t "यादृच्छिक संख्या वितरण आवश्यकताओं" इसकी अनुमति देता है; वितरण वस्तुओं विशेष रूप से राज्य है कि प्रत्येक कॉल के साथ परिवर्तन। इसलिए उन्हें लॉकिंग उद्देश्यों के लिए इंजन के हिस्से के रूप में माना जाना चाहिए। – Potatoswatter