2008-11-04 5 views
8

मुझे लंबे समय से एक एसटीएलश कंटेनर की इच्छा थी जो मैं साझा मेमोरी सेगमेंट या मेमोरी मैप की गई फाइल में रख सकता था।कोई भी C++ के लिए एक अच्छा साझा स्मृति कंटेनर है?

मैंने एक कस्टम आवंटक का उपयोग माना है और नियमित एसटीएल कंटेनर को साझा मेमोरी सेगमेंट में रखने के लिए नया प्लेसमेंट माना है। (इस डीडीजे article की तरह)। समस्या यह है कि एसटीएल कंटेनर आंतरिक रूप से उनके पास स्मृति की ओर इशारा करते हैं। इसलिए, यदि साझा मेमोरी सेगमेंट या मेमोरी मैप की गई फ़ाइल किसी भिन्न बेस पते पर लोड हो जाती है (शायद बाद में चलाने पर, या दूसरी प्रक्रिया में), तो आंतरिक पॉइंटर्स अचानक अमान्य हो जाते हैं। जहां तक ​​मैं समझ सकता हूं, कस्टम आवंटन दृष्टिकोण केवल तभी काम करता है जब आप हमेशा एक ही पते पर मेमोरी सेगमेंट को अपनी प्रक्रिया में मैप कर सकते हैं। कम से कम मेमोरी मैप की गई फाइलों के साथ, मुझे इस बात का बहुत अनुभव है कि अगर आप सिस्टम को इसे मैप करते हैं तो यह कहीं भी ऐसा नहीं लगता है।

मुझे यह कैसे करना है इस बारे में कुछ विचार हैं, लेकिन अगर मैं किसी और ने पहले से ही काम किया है (मैं आलसी हूं) तो मैं इससे बचना चाहूंगा।

मैं वर्तमान में चर्चा से बाहर निकल रहा हूं, क्योंकि सबसे अच्छी लॉकिंग रणनीति अत्यधिक एप्लिकेशन निर्भर है।

उत्तर

12

इसके लिए सबसे अच्छा प्रारंभिक बिंदु शायद इंटरप्रोसेस पुस्तकालयों को बढ़ावा देता है। interprocess map

आप शायद भी ऑफसेट स्मार्ट संकेत पर खंड है, जो आंतरिक सूचक समस्या आप की बात कर रहे थे हल करती है पढ़ना चाहेंगे: वे साझा स्मृति में यहां एक नक्शे का एक अच्छा उदाहरण है। Offset Pointer

+1

मैं व्यक्तिगत अनुभव का उपयोग करके इस उत्तर का समर्थन करता हूं। आईपीसी का उपयोग करके ऑनलाइन गाइड बनाया गया एक हवा! www.boost.org/doc/libs/1_36_0/doc/html/interprocess/quick_guide.html www.boost.org/doc/libs/1_36_0/doc/html/interprocess/sharedmemorybetweenprocesses.html#interprocess.sharedmemorybetweenprocesses.mapped_file – pestophagous

0

आप Intel Threading Building Blocks (TBB) Containers को भी चेकआउट करना चाह सकते हैं।

+0

मानता है कि वह धागे का उपयोग कर रहा है, जो संभवतः मामला नहीं है। –

0

मुझे ACE के साथ हमेशा अच्छे अनुभव (साल पहले) थे। यह एक नेटवर्किंग/संचार ढांचा है, लेकिन साझा स्मृति पर एक अनुभाग है।

0

मुझे केवल मालिकाना संस्करणों के बारे में पता है। Bloomberg और EA दोनों ने अपने एसटीएल संस्करणों के बारे में प्रकाशित किया है, लेकिन उनके श्रम के फल (मेरे ज्ञान के लिए) जारी किए गए हैं।

+0

ब्लूमबर्ग में "एसटीएल संस्करण" के रूप में विकसित "बीडीई" पुस्तकालयों की व्याख्या करने के लिए यह भ्रामक है - इंटरफेस और समझौता बेहद अलग हैं। –

-1

क्यूटी के QSharedMemory कार्यान्वयन का उपयोग करने का प्रयास करें।

+0

मैंने अभी QSharedMemory को देखा - यह सिर्फ साझा स्मृति पहुंच देता है, यह किसी भी प्रकार के कंटेनर नहीं देता है। –

+0

सहमत हुए। मेरी गलती। मैंने एचवी ने एक निश्चित आकार संदेश कतार लागू की है। –

संबंधित मुद्दे