मान लीजिए कि मैं एक वर्ग है कि इस (वास्तव में वास्तव में इस आकार) की तरह लग रहा है:एक साझा म्यूटेक्स अपेक्षाकृत बड़ी संरचना के परमाणु से अधिक कुशल है?
class K
{
public:
long long get_x() const; // lock m_mutex in shared/read-only mode
void update(long long w); // lock m_mutex with a unique_lock
private:
long long m_a;
long long m_b;
long long m_c;
long long m_x;
double m_flow_factor;
mutable boost::shared_mutex m_mutex;
};
आप देख सकते हैं, इस सूत्र-सुरक्षित होना चाहिए। अद्यतन फ़ंक्शन को एक थ्रेड द्वारा एक समय में अज्ञात किया जाता है, अज्ञात लेकिन केवल एक थ्रेड (गारंटीकृत), लेकिन एक ही समय में एक्सेसर को कई धागे द्वारा बुलाया जा सकता है।
अद्यतन फ़ंक्शन सभी मानों को बदल रहा है और इसे अक्सर कहा जाता है (एक हंड्रेड समय एक सेकंड)। वर्तमान कार्यान्वयन, जैसा कि आप अनुमान लगा सकते हैं, बहुत ताले लगाएंगे।
मैं ताले से बचने के लिए std :: परमाणु का उपयोग करने पर विचार कर रहा था और संभावित रूप से इस कोड को और अधिक कुशल बना सकता हूं। हालांकि, मुझे मूल्यों को एक साथ अद्यतन करने के लिए वास्तव में अद्यतन फ़ंक्शन की आवश्यकता है। इसलिए, मैं इस के बजाय की तरह कुछ कर रही पर विचार कर रहा हूँ:
class K
{
public:
long long get_x() const
{ return data.load().x; }
void update(long long w)
{
auto data_now = data.load();
// ... work with data_now
data.store(data_now);
}
private:
struct Data {
long long a;
long long b;
long long c;
long long x;
double flow_factor;
};
std::atomic<Data> data;
};
मेरे एसटीडी की वर्तमान समझ :: परमाणु कि, इस कोड को पिछले एक से अधिक पठनीय है, भले ही (क्योंकि यह ताला घोषणाओं नहीं है हर जगह), के :: डेटा स्ट्रक्चर "बड़ा" है, std :: atomic केवल सामान्य म्यूटेक्स लॉक के साथ कार्यान्वित किया जाएगा (इसलिए यह मेरे प्रारंभिक कार्यान्वयन से भी तेज़ नहीं होना चाहिए)।
क्या मैं सही हूँ?
मुझे नहीं पता था कि shared_mutex के लिए ... जानकारी के लिए धन्यवाद! – Klaim