लिखने की थ्रेड-सुरक्षा मैंने on Stackoverflow पढ़ा है कि एसटीएल कंटेनर में से कोई भी लिखने के लिए थ्रेड-सुरक्षित नहीं है। लेकिन अभ्यास में इसका क्या अर्थ है? क्या इसका मतलब है कि मुझे सादे सरणी में लिखने योग्य डेटा स्टोर करना चाहिए?एक std :: vector बनाम सादे सरणी
मुझे उम्मीद है कि समवर्ती कॉल std::vector::push_back(element)
असंगत डेटा संरचनाओं का कारण बन सकती है क्योंकि यह वेक्टर का आकार बदल सकता है। लेकिन क्या इस तरह के मामले में, जहां का आकार बदलने के शामिल नहीं है के बारे में:)
1 एक सरणी का उपयोग कर:
int data[n];
// initialize values here...
#pragma omp parallel for
for (int i = 0; i < n; ++i) {
data[i] += func(i);
}
2) एक `std :: vector`` का उपयोग कर:
std::vector<int> data;
data.resize(n);
// initialize values here...
#pragma omp parallel for
for (int i = 0; i < n; ++i) {
data[i] += func(i);
}
पहला कार्यान्वयन वास्तव में दूसरे की तुलना में बेहतर है ए) थ्रेड-सुरक्षा के मामले में और बी) प्रदर्शन के संदर्भ में? मैं एक std :: वेक्टर का उपयोग करना पसंद करूंगा, क्योंकि मैं सी-स्टाइल सरणी के साथ कम आरामदायक हूं।
संपादित करें: मैंने #pragma omp atomic update
लिखने की रक्षा की है।
मैं इसे उत्तर देने के लिए पर्याप्त नहीं हूं, लेकिन मुझे यकीन है कि 'std :: vector' के विभिन्न तत्वों को लिखना थ्रेड-सुरक्षित है। – Angew
ये दो स्निपेट समान रूप से थ्रेड सुरक्षित हैं। –
"लेकिन अभ्यास में इसका क्या अर्थ है?" : इसका मतलब है कि एक कंटेनर को विशेष रूप से दोनों लिखने के लिए लेटा जाना चाहिए * और * यदि कोई/या तो ऑपरेशन समवर्ती ** लिखने के साथ मेल खाता है तो पढ़ें। आप सभी पाठकों को अपने इच्छित कंटेनर पर टक्कर दे सकते हैं, लेकिन जैसे ही एक लेखन * संभावित * पेश किया जाता है, सभी दांव बंद हो जाते हैं और आपको * सभी * पहुंच (केवल अन्य लेखकों तक) को कम करना होगा। एक सिंगल-राइट-मल्टी-रीड लॉक इसके लिए अच्छा काम करता है, बीटीडब्ल्यू। – WhozCraig