मेरे पास लैम्ब्डा में लूप चर पैरामीटर के साथ लूप के अंदर एक लैम्ब्डा है। जब मैं इसे चलाता हूं, तो मुझे उम्मीद है कि संख्या 0-9 आउटपुट होगी। लेकिन चूंकि यह एक लैम्ब्डा है, इसलिए एक्स का तुरंत मूल्यांकन नहीं होता है।लैंपडा अंदर लूप
for(int x = 0; x < n; ++x)
{
vec.push_back(thread{[&x](){
m.lock();
cout << x << endl;
m.unlock();
}});
}
आउटपुट:
0
3
3
9
आदि
अन्य भाषाओं के लिए समाधान के लिए एक अस्थायी चर बनाने के लिए हो सकता है,
for(int x = 0; x < n; ++x)
{
int tmp = x;
vec.push_back(thread{[&tmp](){
m.lock();
cout << tmp << endl;
m.unlock();
}});
}
लेकिन यह है कि काम करने के लिए प्रतीत नहीं होता ।
एक जवाब के लिए मेरे खोज में, मैं इस सवाल Generalizing C++11 Threads class to work with lambda जो एक कंटेनर कि iterators अमान्य होगा का उपयोग नहीं की सिफारिश पर ठोकर खाई:
Threads receiving wrong parameters
बोनस देखें। क्यों होता है कि मूल्य के बजाय संदर्भ द्वारा/
मुझे मूर्खतापूर्ण लगता है। मैंने गलत समझा कि लैम्ब्डा अभिव्यक्तियों में क्या था और क्या था। इस oversimplified उदाहरण के लिए, हाँ एक लॉक_गार्ड उचित होगा। लेकिन असली एप्लिकेशन में, फ़ंक्शन बहुत कुछ करता है जिसे लॉक करने की आवश्यकता नहीं होती है। उस स्थिति में एक म्यूटेक्स उपयुक्त लॉकिंग और केवल महत्वपूर्ण भाग के आसपास अनलॉक होगा, सही? – SaulBack
@ सॉलबैक: नहीं। आपको किसी भी तरह से 'lock_guard' का उपयोग करना चाहिए। यदि आप केवल कुछ कोड लॉक करना चाहते हैं, तो लॉक कोड को संलग्न करने के लिए '{}' के साथ एक स्पष्ट ब्लॉक का उपयोग करें। यह यहां मूल आरएआईआई कोडिंग है। –
@ सॉलबैक: विशेष रूप से जटिल कोड में आप RAII का उपयोग करना चाहते हैं, उदाहरण के लिए, 'std :: lock_guard '! इस ** मामूली ** उदाहरण में मैं देख सकता हूं कि इसकी आवश्यकता नहीं है, लेकिन जिस क्षण यह थोड़ा और जटिल चीजें हाथ से बाहर हो जाती है। यदि आपको उस क्षेत्र को प्रतिबंधित करने की आवश्यकता है जहां लॉक आयोजित किया जाता है, तो स्कोप का उपयोग करें, यानी, ब्रेसिज़ की एक जोड़ी: '{<लॉक और कोड की आवश्यकता है यह यहां जाता है>}'। –