एक नई प्रयोगात्मक सुविधा (शायद सी ++ 20) है, जो "सिंक्रनाइज़ ब्लॉक" है। ब्लॉक कोड के एक खंड पर एक वैश्विक ताला प्रदान करता है। निम्नलिखित cppreference से एक उदाहरण है।सी ++ में नई सुविधा, "सिंक्रनाइज़" ब्लॉक का क्या लाभ है?
#include <iostream>
#include <vector>
#include <thread>
int f()
{
static int i = 0;
synchronized {
std::cout << i << " -> ";
++i;
std::cout << i << '\n';
return i;
}
}
int main()
{
std::vector<std::thread> v(10);
for(auto& t: v)
t = std::thread([]{ for(int n = 0; n < 10; ++n) f(); });
for(auto& t: v)
t.join();
}
मुझे लगता है यह ज़रूरत से ज़्यादा है।
std::mutex m;
int f()
{
static int i = 0;
std::lock_guard<std::mutex> lg(m);
std::cout << i << " -> ";
++i;
std::cout << i << '\n';
return i;
}
केवल लाभ मैं यहाँ लगता है कि मैं एक वैश्विक ताला की मेहनत नहीं बचाया रहा हूँ है: ऊपर से एक तुल्यकालन ब्लॉक के बीच कोई अंतर है, और इस से एक है। सिंक्रनाइज़ ब्लॉक का उपयोग करने के और फायदे हैं? इसे कब प्राथमिकता दी जानी चाहिए?
सुनिश्चित नहीं है कि यह वास्तव में मामला है लेकिन cppreference इसे पहले संस्करण की तरह ध्वनि बनाता है, उदाहरण के क्रम में प्रिंट करने की गारंटी है जबकि AFAIK दूसरा संस्करण नहीं है। – NathanOliver
@NathanOliver क्रम में पहला संस्करण प्रिंट क्यों नहीं करेगा? क्या आप समझाएँगे? जहां तक मुझे समझा गया, कोड का पूरा सेट एक समय में केवल एक बार निष्पादित किया जाएगा, जिसमें प्रिंटिंग भी शामिल है, जो सब कुछ क्रम में कर देगा। यह म्यूटेक्स के लिए भी मामला है। –
"हालांकि वैश्विक लॉक के तहत सिंक्रनाइज़ किए गए ब्लॉक को निष्पादित किया जाता है, लेकिन कार्यान्वयन से प्रत्येक ब्लॉक के भीतर कोड की जांच करने और लेन-देन-सुरक्षित कोड के लिए आशावादी समेकन (जहां उपलब्ध हो वहां हार्डवेयर लेनदेन संबंधी स्मृति द्वारा समर्थित) का उपयोग किया जाता है और गैर- लेनदेन सुरक्षित कोड। " – cpplearner