2010-03-05 12 views
18

मैंने पाया इस: Fast interprocess synchronization methodक्या साझा स्मृति में pthread mutexes धागे में काम करते हैं?

मुझे विश्वास है कि एक pthread म्युटेक्स केवल एक ही पता स्थान में दो धागे के बीच साझा किया जा सकता का इस्तेमाल किया।

अगर मैं दो अलग-अलग proceses एक & बी वे एक साझा स्मृति क्षेत्र एम मैं एम में एक pThread म्युटेक्स, एक में ताला डाल सकते है है, में बंद:

प्रश्न/उत्तर वहाँ संकेत करने लगता है बी, ए में अनलॉक; और बी अब mutex पर अवरुद्ध नहीं होगा। क्या ये सही है? क्या mutexes को दो अलग-अलग प्रक्रियाओं में साझा किया जा सकता है?

संपादित करें: मैं MacOSX पर C++ का उपयोग कर रहा हूं।

+0

ओपी का संबंधित प्रश्न: http://stackoverflow.com/questions/2389307/on-macosx-in-c-how-to-do-interprocess-communication-over-shared-memory-withou – Void

उत्तर

1

मैं चिंतित हूं कि वहाँ एक शर्त है जहाँ साझा स्मृति में एक म्यूटेक्स ठीक व्यवहार करने के लिए असफल हो सकता है हो सकता है नहीं था, इसलिए मैं कुछ खुदाई किया था और कुछ दस्तावेज जो एक नहीं brainer की तरह इस मुद्दे को इलाज के साथ आया था:

https://computing.llnl.gov/tutorials/pthreads/

आगे खुदाई, हालांकि, पता चला है कि glibc के पुराने संस्करणों साझा स्मृति mutexes में मुद्दों का सामना करना पड़ा: (यह एक प्राचीन परिवर्तन है, लेकिन यह बिंदु दिखाता है।)

in linuxthreads/mutex.c 
int __pthread_mutexattr_setpshared(...) { 
    /* For now it is not possible to shared a conditional variable. */ 
    if (pshared != PTHREAD_PROCESS_PRIVATE) 
    return ENOSYS; 
} 

बारे में अधिक विस्तार के बिना आप जिस पर्थ्रेड का उपयोग कर रहे हैं उसका कार्यान्वयन, यह कहना मुश्किल है कि आप सुरक्षित हैं या नहीं।

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

मुझे पता है कि यह एक म्युटेक्स की परिभाषा का सामना करने में मक्खियों लेकिन यह संभव है:

दो धागे विभिन्न प्रक्रियाओं में एक ही समय में काम कर रहे हैं, तो इसका अर्थ है कि वे अलग अलग कोर पर हैं। दोनों अपनी वैश्विक ताला वस्तु प्राप्त करते हैं और साझा स्मृति में म्यूटेक्स में हेरफेर करने के लिए जाते हैं। यदि पाथ्रेड कार्यान्वयन कैश के माध्यम से म्यूटेक्स के अपडेट को मजबूर करता है, तो दोनों थ्रेड एक ही समय में अपडेट हो सकते हैं, दोनों सोचते हैं कि वे म्यूटेक्स धारण करते हैं। यह केवल एक संभावित विफलता वेक्टर है जो दिमाग में आता है। दूसरों की संख्या हो सकती है। आपकी स्थिति के विनिर्देश क्या हैं - ओएस, pthreads संस्करण, आदि?

+0

आपका लिंक मानक pThread है प्रलेखन। यह समस्या को कोई ब्रेनर कैसे बनाता है? – anon

5

अपने सी/pthread पुस्तकालय अनुरूप है, तो आप अगर यह अगर _POSIX_THREAD_PROCESS_SHARED सुविधा परीक्षण मैक्रो -1 के अलावा किसी अन्य मूल्य के लिए या कम से सिस्टम विन्यास पूछताछ की परिभाषित किया गया है की जाँच करके mutexes कई प्रक्रिया भर में साझा का समर्थन करता है बताने के लिए सक्षम होना चाहिए sysconf(_SC_THREAD_PROCESS_SHARED) का उपयोग कर रन-टाइम यदि वह सुविधा परीक्षण मैक्रो अपरिभाषित है।

संपादित: Steve pointed out के रूप में, आप स्पष्ट रूप से मंच संभालने प्रक्रियाओं में साझा करने के लिए म्युटेक्स कॉन्फ़िगर करना होगा, जैसा कि मैंने ऊपर वर्णित है कि सुविधा का समर्थन करता।

+0

ध्यान रखें कि ओएस कार्यान्वयन कभी-कभी सकारात्मक होने के लिए '_POSIX_THREAD_PROCESS_SHARED' को परिभाषित कर सकता है लेकिन वास्तव में इसे लागू नहीं करता है (क्योंकि POSIX कहता है कि यह वैकल्पिक है)। इस के साथ copes को बढ़ावा देने के लिए https://github.com/boostorg/interprocess/blob/4f8459e868617f88ff105633a9aa82221d5e9bb1/include/boost/interprocess/detail/workaround.hpp#L45 देखें। – Anon

13

आप म्युटेक्स बताने के लिए प्रक्रिया से साझा की गई, जब यह inited है करने की आवश्यकता है:

http://www.opengroup.org/onlinepubs/007908775/xsh/pthread_mutexattr_setpshared.html

विशेष रूप से ध्यान दें, "विशेषता का डिफ़ॉल्ट मान PTHREAD_PROCESS_PRIVATE है" अर्थ, कि विभिन्न प्रक्रियाओं से उस तक पहुँचने अपरिभाषित व्यवहार है।

+1

+1। मैं इसे अपने उत्तर में इंगित करना भूल गया। :) – Void

+0

वर्तमान संस्करण का लिंक: http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_setpshared.html – alk

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