2011-06-23 17 views
7

मैंने पहले से ही एक ही पोस्ट को देखा जो मुझे मिल सकता था, लेकिन यह वह नहीं था जिसे मैं ढूंढ रहा था।फोर्क के साथ साझा मेमोरी का उपयोग करना()

असल में, मैं Odd-Even Sort को फोर्किंग के साथ चलाने की कोशिश कर रहा हूं, इसलिए बच्चा बाधाओं को चलाता है और माता-पिता भी शाम को चलाता है। इन दोनों को वेक्टर इनपुट वैल्यूज के साथ-साथ बूलियन सॉर्ट किए जाने की आवश्यकता होती है।

निम्नलिखित कोड स्मृति साझा करने में मेरी असफल प्रयासों के किसी भी बिना है, और खोज एल्गोरिथ्म के साथ कांटे प्रयोग करने के लिए सिर्फ बुनियादी ढांचा है:

while(!sorted) 
{ 
    pID = fork(); 
    sorted = true; 
    cout << "Sort set to TRUE." << endl; 

    if(pID == 0) 
    { 
     int num = 1; 
     cout << "Child swap run" << endl; 
     Swap((void *) num); 
     cout << "Status: " << ((sorted) ? "SORTED" : "UNSORTED") << endl; 
     exit(0); 
    } 
    else if(pID < 0) 
    { 
     cout << "Failed to fork." << endl; 
     exit(1); 
    } 
    else 
    { 
     wpid = waitpid(pID, &status, waitStatus); 
     int num = 0; 
     cout << "Parent swap run" << endl; 
     Swap((void *) num); 
     cout << "Status: " << ((sorted) ? "SORTED" : "UNSORTED") << endl; 
    } 
} 

मैं इस साझा करने बाहर हैकिंग के कई तरीके की कोशिश की है स्मृति का, लेकिन कोई भी संसाधन नहीं ढूंढ सकता जो वास्तव में बताता है कि यह कैसे काम करता है, मुझे क्या चाहिए, और इसे करने का सबसे अच्छा तरीका है।

तो, मेरी आवश्यकताओं इस प्रकार हैं:

  • माता-पिता और बच्चे का हिस्सा है और एक वैश्विक वेक्टर और हेरफेर करने के लिए सक्षम होना चाहिए बूलियन
  • यह एक पाश में चलाने के लिए सक्षम दिखाया गया है
  • होना चाहिए
  • इस चर के साथ काम करना चाहिए मुख्य में() इस्तेमाल किया जा रहा है और स्वैप() फ़ंक्शन

में आप कोई सुझाव है, मैं बहुत उन्हें इसकी सराहना करेंगे। धन्यवाद!

+0

'shm_open' POSIX API कॉल के लिए मैन पेज पर एक नज़र डालें। आप एक साझा-मेमोरी क्षेत्र बनाना चाहते हैं, और वहां दोनों प्रक्रियाओं द्वारा उपयोग किए गए किसी भी चर को डालना चाहते हैं। आप इसे आसानी से 'mmap' कॉल के साथ भी कर सकते हैं। अपने एक्सेस को थ्रेड-सुरक्षित बनाने के लिए सुनिश्चित करें ... साझा मेमोरी का उपयोग करने में निहित कोई लॉकिंग नहीं है, इसलिए आपको ध्यान रखना होगा। – Borealid

+0

'shm_open' के साथ ध्यान में रखें, आपको साझा स्मृति ऑब्जेक्ट के लिए स्थान आवंटित करने के लिए' ftruncate' को कॉल करने की आवश्यकता होगी, इसलिए फिर, स्मृति ऑब्जेक्ट में स्थान गतिशील रूप से बढ़ेगा जैसे आप 'std :: vector'। यदि आपको अधिक जगह चाहिए तो आपको रनटाइम पर साझा मेमोरी ऑब्जेक्ट का आकार मैन्युअल रूप से प्रबंधित करना होगा। – Jason

+0

यह स्पष्ट रूप से सी कोड नहीं है। – Puppy

उत्तर

4

आप shmget() और shmat() सेटअप करने के लिए एक साझा स्मृति वस्तु का उपयोग करने के लिए जा रहे हैं, लेकिन दुर्भाग्य से है कि एक std::vector की तरह एक गतिशील स्मृति वस्तु नहीं होगा। दूसरे शब्दों में, आपको साझा मेमोरी ऑब्जेक्ट की शुरुआत के बिंदु पर ऑब्जेक्ट का पूरा आकार घोषित करना होगा। हालांकि प्रक्रिया बहुत सीधी है, इसमें आपके माता-पिता में आप साझा स्मृति ऑब्जेक्ट बनाने के लिए IPC_CREAT ध्वज के साथ shmget() पर कॉल करेंगे और ऑब्जेक्ट के लिए आईडी मान प्राप्त करेंगे। फिर ऑब्जेक्ट को पॉइंटर प्राप्त करने के लिए आईडी मान के साथ shmat() पर कॉल करें। इसके बाद, ऑब्जेक्ट को डिफ़ॉल्ट मानों के साथ प्रारंभ करें। जब आप अपने बच्चे की प्रक्रिया के लिए फोर्क करते हैं, तो shmat() से लौटाया गया पॉइंटर अभी भी बाल प्रक्रिया में मान्य होगा, इसलिए आप उसी पॉइंटर चर का उपयोग करके माता-पिता और बच्चे दोनों में स्मृति साझा कर सकते हैं।

तुम भी माता-पिता की प्रक्रिया में घोषित करने के लिए इससे पहले कि आप किसी भी बच्चों pshared विशेषता 0 से अधिक मान पर सेट के साथ एक सेमाफोर sem_init() का उपयोग कर कांटा चाहता हूँ। फिर दोनों माता-पिता और बाल प्रक्रियाएं साझा मेमोरी ऑब्जेक्ट तक पहुंच को नियंत्रित करने के लिए सेमफोर का उपयोग कर सकती हैं।

फिर भी, ध्यान रखें कि साझा स्मृति वस्तु गतिशील वस्तु नहीं है, इसलिए जब आप इसे प्रारंभ करते हैं तो आपको इसके लिए पर्याप्त स्थान आवंटित करने की आवश्यकता होगी।

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