2012-04-18 9 views
5

एक सेमाफोर num_of_sems संकेतबाहु साथsemid सेट और तो अगर मैं है एक sembuf*deleter_searchers_downसेम: जब सेफफोर्स का एक सेट कम हो रहा है तो सभी एक बार में कमी हो जाते हैं या यह पहली विफलता पर अवरुद्ध करता है?

struct sembuf *deleter_searchers_down 
         = malloc(sizeof (*deleter_searchers_down) * num_of_sems); 
for (i = 0; i < num_of_sems; ++i) { 
      (deleter_searchers_down + i)->sem_op = -1; 
      (deleter_searchers_down + i)->sem_num = i; 
      (deleter_searchers_down + i)->sem_flg = SEM_UNDO; 
     } 
semop(semid, deleter_searchers_down, num_of_sems); 

कॉल semop को एक ही बार में सेट में सभी संकेतबाहु कम करने का प्रयास करेंगे या एक बार यह प्रयास करता है यह अवरुद्ध कर देगा पहले सेमफोर को कम करने के लिए 0 और कुछ अन्य प्रक्रियाओं के बाद जारी रखें जो विशेष सेमफोर?

+0

अच्छी तरह से सेमेफोर ठीक वही करते हैं जो आप कहते हैं, यानी, जब वे कम हो जाते हैं, यदि वे 0 हैं तो वे प्रक्रिया को अवरुद्ध करते हैं। – byrondrossos

+0

सवाल ध्यान से plz पढ़ें - शून्य लोगों के सभी पर सेट और ब्लॉक के सभी को कम करने के प्रयास semop जाएगा या यह पहली बार पर अवरुद्ध कर देगा (पहले?) 0 –

+0

आप विफलता पर तुरंत वापस जाने के लिए IPC_NOWAIT निर्दिष्ट कर सकते हैं का सामना करना पड़ा। देखें: http: //pubs.opengroup.org/onlinepubs/7908799/xsh/semop.html – RedX

उत्तर

6

कोई अद्यतन होने तक सभी अद्यतन एक इकाई के रूप आगे बढ़ सकते हैं।

POSIX विनिर्देशन इस बात के बारे में स्पष्ट किया जा सकता है, हालांकि यह कहा गया है कि semop परमाणु है।

लिनक्स पर, semop(3) ग्लिबैक में semop(2) के आसपास एक साधारण रैपर है। बदले में semop(2) मैनपेज का कहना है, कि है, आपरेशन प्रदर्शन कर रहे हैं या तो एक पूर्ण इकाई के रूप में, या बिल्कुल नहीं

sops में निहित आपरेशन के सेट सरणी आदेश, और atomically में किया जाता है।

HP-UX semop(2) मैनपेज भी स्पष्ट है:

सेमाफोर सरणी संचालन सेमाफोर संचालन सरणी में सेमाफोर के सभी पर स्थिति को अवरुद्ध जब तक प्रदर्शन कर रहे हैं कि कोई भी में परमाणु कर रहे हैं हटा दिया गया है।

+0

धन्यवाद - क्या इसका मतलब यह है कि सेमिड को नीचे करने की प्रक्रिया पहले एरे तत्व पर अवरुद्ध होगी जो 0 और semop() सभी पिछले सरणी तत्वों को नीचे() को पूर्ववत कर देगी? –

+0

यह कार्यान्वयन पर निर्भर है। उदाहरण के तौर पर, लिनक्स ipc/sem.c (फ़ंक्शन 'try_atomic_semop') में कोड कुछ ऐसा वर्णन करता है जो आप वर्णन करते हैं। यह संचालन की कोशिश करता है, और यदि उनमें से कोई भी ब्लॉक करता है, तो परिवर्तन पूर्ववत हो जाते हैं। लेकिन एक महत्वपूर्ण बात है: सैमफोर सेट पर लॉक रखने के दौरान अपडेट किए जाते हैं। तो असंगत स्थिति किसी भी अन्य कार्य के लिए दृश्यमान नहीं है: सेमफोर को बदलने की इच्छा रखने वाले कार्य को पहले लॉक प्राप्त करना होगा, और सेमफोर पर अवरुद्ध कार्य पहले ही सो रहा है। तो अंत में ऑपरेशन वास्तव में परमाणु है। –

+0

ठीक है - धन्यवाद - एक आखिरी बिंदु: कोई मौका नहीं है (कार्यान्वयन) प्रक्रिया कॉलिंग semop _all_ semaphores पर ब्लॉक होगा जो 0 हैं? –

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