मैं डेटा के एक टुकड़े को गठबंधन करने के तरीकों को देख रहा हूं जिसे थ्रेड-सुरक्षा के लिए प्रावधान किए गए लॉक के साथ कई थ्रेडों द्वारा एक्सेस किया जाएगा। मुझे लगता है कि मुझे एक ऐसे बिंदु पर जाना है जहां मुझे लगता है कि ऐसा करने के लिए यह संभव नहीं है कि यह स्थिरता बनाए रखे।डेटा और उसके लॉक को जोड़ते समय कॉन्स्ट-सही होना असंभव है?
उदाहरण के लिए निम्नलिखित वर्ग लें:
template <typename TType, typename TMutex>
class basic_lockable_type
{
public:
typedef TMutex lock_type;
public:
template <typename... TArgs>
explicit basic_lockable_type(TArgs&&... args)
: TType(std::forward<TArgs...>(args)...) {}
TType& data() { return data_; }
const TType& data() const { return data_; }
void lock() { mutex_.lock(); }
void unlock() { mutex_.unlock(); }
private:
TType data_;
mutable TMutex mutex_;
};
typedef basic_lockable_type<std::vector<int>, std::mutex> vector_with_lock;
इस में मैं, डेटा और ताला गठबंधन करने के लिए mutex_
mutable
के रूप में चिह्नित की कोशिश करो। दुर्भाग्यवश यह पर्याप्त नहीं है क्योंकि मैं इसे देखता हूं क्योंकि vector_with_lock
को mutable
के रूप में चिह्नित किया जाना चाहिए ताकि const
फ़ंक्शन से एक पठन ऑपरेशन किया जा सके जो पूरी तरह से सही नहीं है (data_
mutable
एक कॉन्स से होना चाहिए) ।
void print_values() const
{
std::lock_guard<vector_with_lock> lock(values_);
for(const int val : values_)
{
std::cout << val << std::endl;
}
}
vector_with_lock values_;
किसी को भी इस तरह के आसपास वैसे भी देख सकते हैं कि स्थिरांक-शुद्धता डेटा संयोजन और ताला जबकि बनाए रखा है? साथ ही, क्या मैंने यहां कोई गलत धारणाएं की हैं?
'लॉक' और 'अनलॉक' कॉन्स बनाएं? (साथ ही, यह 'std :: lock_guard' नहीं होना चाहिए? यदि आप इसका उपयोग नहीं कर रहे हैं तो आप एक नया लॉक करने योग्य क्यों बनाते हैं?) –
अपडेट किया गया 'lock_guard' – Graeme
@ आर। मार्टिनिन्हो फर्नांडीस बेशक, इन्हें चिह्नित करना कॉन्स एक गैर-परिवर्तनीय 'vector_with_lock' इंस्टेंस कॉल 'लॉक' और' अनलॉक 'की अनुमति देगा, हां? – Graeme