2012-07-26 23 views
5

मैं सी ++ में अपने एमएमओआरजीपी में मल्टीथ्रेडिंग का उपयोग करना चाहता हूं, इस समय 5वें धागे मिल गए हैं, और मैं दो में से एक को विभाजित करना चाहता हूं, लेकिन मेरा mmorpg सर्वर वैक्टरों के भार के अनुरूप है, और क्योंकि वेक्टर थ्रेडसेफ लिखने के लिए नहीं हैं, मैं इसे ठीक से नहीं कर सकता।एमएमआरजीपी में सी में मल्टीथ्रेडिंग

क्या थ्रेड में वैक्टर का उपयोग करने का कोई विकल्प है, या वेक्टर को पढ़ने/लिखने के लिए मल्टीथ्रेड सुरक्षित बनाने का कोई तरीका है।

मैं जो कुछ भी नहीं चाहता, उसका एक उदाहरण है, इस तरह के किसी विकल्प को खोजने का प्रयास करें: जाहिर है यह वास्तविक कोड नहीं है, मैं सिर्फ एक उदाहरण बना रहा हूं।

//Thread1 
//Load monster and send data to the player 
globals::monstername[myid];//Myid = 1 for now -.- 
senddata(globals::monstername[myid]);//Not the actual networking code, im just lazy. 

//Thread2 
//Create a monster and manage it 
globals::monstername.push_back("FatBlobMonster"); 
//More managing code i cant be bothered inserting >.< 

उत्तर

4

मुझे किसी भी थ्रेड सुरक्षित वेक्टर कक्षा से अवगत नहीं है। हालांकि, अगर आप एक अपने आप बना सकते हैं कि (सी ++ 11 में) std::vector और एक std::mutex उपयोग करता है:

template <typename T> 
class LockedVector { 

private: 
    std::mutex m; 
    std::vector<T> vec; 
}; 

आप std::lock साथ म्युटेक्स ताला।

+0

धन्यवाद, क्या आप कृपया इसका उपयोग कैसे करें और यह कैसे काम करता है? :) –

+0

कृपया एक नज़र डालें: http://en.cppreference.com/w/cpp/thread/lock –

+0

यह बहुत अच्छी तरह से काम नहीं करेगा। क्योंकि आप पूरी सरणी लॉक कर रहे हैं। तो जब आप एकाधिक धागे प्राप्त कर सकते हैं - वे सभी एक दूसरे पर वेक्टर तक पहुंचने की प्रतीक्षा करेंगे। तो वेक्टर पर संचालन में समान प्रदर्शन विशेषताओं की तरह होगी जैसे कि वे एक ही धागे में थे। –

6

दो चीजें।

  1. साझा डेटा को एक बड़ी डेटा संरचना में संग्रहीत न करें जो पूरी तरह से बंद हो जाता है। इसके कुछ हिस्सों को लॉक करें। उदाहरण के लिए, यदि आपको वैक्टर का उपयोग करना चाहिए, तो वेक्टर के क्षेत्रों के लिए ताले का एक सेट बनाएं। मान लें कि मेरे पास 1000 प्रविष्टियां हैं, मैं 10 ताले बना सकता हूं, प्रत्येक प्रत्येक 100 लगातार प्रविष्टियों को लॉक करता है। लेकिन आप शायद बेहतर कर सकते हैं। उदाहरण के लिए, अपने राक्षसों को हैश टेबल में स्टोर करें, जहां आपकी हैश तालिका में प्रत्येक "बाल्टी" का अपना लॉक होता है।

  2. "पढ़ने/लिखने" लॉक का उपयोग करें। एक प्रकार का ताला बनाना संभव है जो एकाधिक पाठकों और एक लेखक को अनुमति देता है। तो प्रत्येक हैश बाल्टी में एक पठन लिखना लॉक हो सकता है। यदि किसी विशेष बाल्टी में कोई राक्षस नहीं बनाया जा रहा है, तो कई धागे राक्षसों को उस बाल्टी से पढ़ सकते हैं। यदि आपको बाल्टी में एक नया राक्षस हैश करने की ज़रूरत है तो आप बाल्टी को लिखने के लिए बंद कर दें। यह लॉक सभी मौजूदा पाठकों को रिलीज़ होने की प्रतीक्षा करेगा, और लिखने तक पूरा होने तक अधिक पाठकों को लॉक करने की अनुमति नहीं देगा। एक बार जब कोई और पाठक नहीं होता है, तो डब्ल्यू राइट ऑपरेशन

+0

आप वेक्टर के विशिष्ट हिस्सों को लॉक कर सकते हैं? या आप कह रहे हैं कि एकाधिक वैक्टर का उपयोग करें और उन्हें अलग-अलग लॉक करें? – Drise

+0

यदि आपके वेक्टर को बढ़ने के रूप में खुद को पुन: स्थापित करना है तो आपको पूरी चीज को आकार बदलने के लिए लॉक करना होगा। लेकिन जब तक कोई आकार बदल नहीं जाता है, और यदि तत्व अवधि के लिए ऑफ़सेट पर रह सकते हैं तो आप सरणी के अलग-अलग हिस्सों को लॉक कर सकते हैं। लेकिन यह वास्तव में मुद्दा नहीं है। बिंदु डेटा संरचना का उपयोग करना है जिसे भागों में लॉक किया जा सकता है। उप सरणी की एक सूची भी काम करेगी। –

+0

दिलचस्प। और हाँ, मुझे समझ में आया, क्यों नहीं पता था कि आप वैक्टर/सरणी के हिस्सों को बंद कर सकते हैं। – Drise