मैं अपने प्रोजेक्ट में एक बिंदु पर पहुंच गया हूं जिसके लिए उन संसाधनों पर धागे के बीच संचार की आवश्यकता है जो बहुत अच्छी तरह से लिखे जा सकते हैं, इसलिए सिंक्रनाइज़ेशन जरूरी है। हालांकि मैं मूल स्तर के अलावा किसी अन्य चीज़ पर सिंक्रनाइज़ेशन को वास्तव में समझ नहीं पा रहा हूं।std :: lock_guard उदाहरण, यह क्यों काम करता है
इस लिंक में पिछले उदाहरण पर विचार करें: http://www.bogotobogo.com/cplusplus/C11/7_C11_Thread_Sharing_Memory.php
#include <iostream>
#include <thread>
#include <list>
#include <algorithm>
#include <mutex>
using namespace std;
// a global variable
std::list<int>myList;
// a global instance of std::mutex to protect global variable
std::mutex myMutex;
void addToList(int max, int interval)
{
// the access to this function is mutually exclusive
std::lock_guard<std::mutex> guard(myMutex);
for (int i = 0; i < max; i++) {
if((i % interval) == 0) myList.push_back(i);
}
}
void printList()
{
// the access to this function is mutually exclusive
std::lock_guard<std::mutex> guard(myMutex);
for (auto itr = myList.begin(), end_itr = myList.end(); itr != end_itr; ++itr) {
cout << *itr << ",";
}
}
int main()
{
int max = 100;
std::thread t1(addToList, max, 1);
std::thread t2(addToList, max, 10);
std::thread t3(printList);
t1.join();
t2.join();
t3.join();
return 0;
}
उदाहरण दर्शाता है कि कैसे तीन सूत्र, दो लेखकों और एक पाठक, एक साझा संसाधन (सूची) तक पहुँचता है।
दो वैश्विक कार्यों का उपयोग किया जाता है: एक जिसे दो लेखक धागे द्वारा उपयोग किया जाता है, और पाठक धागे द्वारा उपयोग किया जा रहा है। दोनों कार्य एक ही संसाधन, सूची को लॉक करने के लिए लॉक_गार्ड का उपयोग करते हैं।
अब यह है कि मैं अपने सिर को चारों ओर लपेट नहीं सकता हूं: पाठक दो लेखक धागे की तुलना में एक अलग दायरे में लॉक का उपयोग करता है, फिर भी एक ही संसाधन को बंद कर देता है। यह कैसे काम कर सकता है? म्यूटेक्स की मेरी सीमित समझ लेखक समारोह में अच्छी तरह से उधार देती है, वहां आपको सटीक एक ही फ़ंक्शन का उपयोग करके दो धागे मिलते हैं। मैं समझ सकता हूं कि, एक चेक सही है क्योंकि आप संरक्षित क्षेत्र में प्रवेश करने वाले हैं, और यदि कोई और पहले से ही अंदर है, तो आप प्रतीक्षा करें।
लेकिन जब दायरा अलग है? यह इंगित करेगा कि प्रक्रिया के मुकाबले कुछ प्रकार का तंत्र अधिक शक्तिशाली है, कुछ प्रकार के रनटाइम पर्यावरण "देर से" थ्रेड के निष्पादन को अवरुद्ध कर रहा है। लेकिन मैंने सोचा कि सी ++ में ऐसी कोई चीज नहीं थी। तो मैं एक नुकसान में हूँ।
यहां हुड के नीचे क्या चल रहा है?
मैं जोड़ना चाहता हूं कि म्यूटेक्स लॉकिंग [परमाणु] (http://stackoverflow.com/questions/15054086/what-does-atomic-mean-in-programming)। उम्मीद है की यह मदद करेगा। – Incomputable