लॉकिंग और ऑपरेशन लंबे समय ले रहा है

मुझे लगता है कि यह एक आम समस्या है। उदाहरण के लिए, मेरे पास एक सरणी है जिसे एक प्रक्रिया/धागे द्वारा संशोधित किया जाता है:

lock();
for(int i; i

एक और प्रक्रिया/धागा है जो कभी-कभी पूरे सरणी को प्रिंट करेगा, लेकिन इसमें "लंबा" समय लग सकता है:

lock()
for(int i; i

क्या पूरे सरणी को मुद्रित करने के लिए कोई बेहतर दृष्टिकोण है?

0
जोड़ा
विचारों: 1

2 उत्तर

यदि यह प्रिंटिंग हिस्सा है जो लंबे समय से ले रहा है, तो आप लॉक ले सकते हैं, सरणी की एक प्रतिलिपि ले सकते हैं, लॉक जारी कर सकते हैं और सरणी प्रतिलिपि मुद्रित कर सकते हैं।

0
जोड़ा
यह निश्चित रूप से तेज़-प्रति-प्रति प्रकार के छोटे सरणी के लिए व्यवहार्य है, लेकिन यदि यह प्रिंट करने के लिए समय चल रहा है ...
जोड़ा लेखक arne, स्रोत

आप किस प्रकार के ताले का उपयोग करते हैं, म्यूटेक्स? इसके अलावा आप अपनी सरणी में अलग-अलग कोशिकाओं के बीच किस प्रकार की स्थिरता की अपेक्षा करते हैं, जब (1) उन्हें अपडेट करें, और (2) जब आप उन्हें प्रिंट करते हैं? यदि प्रत्येक सरणी-सेल स्वतंत्र है, तो क्यों न केवल उन कोशिकाओं के लिए जिम्मेदार प्रत्येक और अधिक ताले हैं?

पसंद;

mutex locks[array_size];
for (int i=0; i< mutex_size; i++) {
   locks[i].lock();
   //do something or print content...
   locks[i].unlock();   
}

हालांकि अगर आपकी सरणी का अर्थशास्त्र ऐसा है कि कोशिकाएं एक-दूसरे से स्वतंत्र नहीं हैं लेकिन आपको सरणी में परमाणु स्थिरता की आवश्यकता है, तो आप अपने मूल वैश्विक लॉक से फंस गए हैं।

हालांकि आप अभी भी लॉक के नीचे सरणी की प्रतिलिपि ले सकते हैं और फिर प्रतिलिपि मुद्रित कर सकते हैं, क्योंकि प्रिंट के लिए इंतजार न करने के लिए सरणी के लॉक को कम समय पर रखेगा।

0
जोड़ा
यदि सरणी तत्वों के बीच स्थिरता महत्वपूर्ण नहीं है, तो कोई भी std :: परमाणु सरणी प्रकारों का उपयोग कर सकता है।
जोड़ा लेखक arne, स्रोत