2011-06-25 5 views
5

जबकि मैं pthread_rwlock_unlock फ़ंक्शन के मैन पेज को देख रहा हूं, मैंने देखा कि अगर कॉलिंग थ्रेड के पास रॉकल का स्वामित्व नहीं है तो func EPERM वापस कर देगा।बहुत सारे पाठक होने पर pthread_rwlock का उपयोग करने की दक्षता

चूंकि rdlock कई धागे को लॉक प्राप्त करने की अनुमति देता है, इसलिए एक विशिष्ट रॉकल के मालिक को स्टोर करने के लिए एक लिंक या सरणी जैसी डेटा संरचना होनी चाहिए।

यहाँ सवाल आता है:

rwlock दक्षता प्राप्त करने के लिए जब पढ़ने आपरेशन लिखने के संचालन तुलना में कहीं अधिक अक्सर होता है डिज़ाइन किया गया है, लेकिन देखते हैं कि अलग-अलग धागे की बड़ी संख्या पढ़ने ताला, हर बार जब मैं फोन मिला एक pthread_rwlock_unlock(), मौसम को खोजने के लिए समय लगता है कॉलिंग थ्रेड वैध स्वामी है। इस परिदृश्य के समय जटिलता ..

धन्यवाद एक बहुत लोग :)

उत्तर

6

एन.एम. ने एक अच्छा जवाब दिया है। लॉक स्वामित्व रखने के लिए संरचनाओं की आपकी धारणा आपके द्वारा टैग किए गए लिनक्स कार्यान्वयन पर गलत है और गिनती विधि n.m. के समान है। पर छूता है

यहाँ से

/usr/include/bits/pthreadtypes.h
struct 
    { 
    int __lock; 
    unsigned int __nr_readers; 
    unsigned int __readers_wakeup; 
    unsigned int __writer_wakeup; 
    unsigned int __nr_readers_queued; 
    unsigned int __nr_writers_queued; 
    int __writer; 
    int __shared; 
    unsigned int __flags; 
    } __data; 

आप गणना फ़ील्ड देख सकते हैं pthread_rwlock_t प्रकार के संपादित संस्करण है। pthread_rwlock_unlock.c EPERM वापस नहीं करता है और अधिकांश कार्य pthread_rwlock_wrlock.c और pthread_rwlock_rdlock.c में लेखक स्वामित्व की जांच के आसपास घूमता है।

आप इसे लॉक घोषित करने और आरंभ करने के लिए एक छोटे से प्रोग्राम के साथ परीक्षण कर सकते हैं और फिर इसे अनलॉक कर सकते हैं।

तो समय की जटिलता इस कार्यान्वयन में निरंतर स्थिर होने लगती है लेकिन कुछ विशेषताओं पर निर्भर करते हुए अर्जित किया जाता है जिसे आपने सोचा था या वहां रहना चाहता था।

5

ध्यान दें कि कार्यान्वयन EPERM वापस जाने के लिए आवश्यक नहीं है क्या है। मानक के अनुसार निर्दिष्ट किसी और के लॉक को अनलॉक करने का नतीजा अनिर्धारित है।

ओ (1) प्राप्त करना आसान है यदि लॉक केवल थ्रेड के मालिक की सूची के बजाय उपयोग गणना को संग्रहीत करता है। यदि कार्यान्वयन लॉक स्वामित्व की जांच करने पर जोर देता है, तो यह थ्रेड को अपने ताले को याद रख सकता है। ऐसे ताले की संख्या सामान्य रूप से छोटी होनी चाहिए। यहां तक ​​कि यदि ऐसा नहीं है, तो कई ताले आमतौर पर एलआईएफओ आदेश में अधिग्रहण किए जाते हैं, इसलिए आम मामला थ्रेड में स्वामित्व वाले ताले के ढेर से ढका होता है।

+0

हां, धन्यवाद एनएम। और बतख, मैंने pthread_rwlock_unlock() के कोड को पढ़ा है, ऐसी कोई जांच नहीं है बल्कि केवल एक काउंटर है। उस स्थिति में, समय जटिलता ओ (1) है। – Hmm

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