2014-08-29 10 views
5

मैं एक पर्ल स्क्रिप्ट लिख रहा था और देखा कि मेरे संपादक ने "लॉक" शब्द को हाइलाइट किया था। मैं उत्सुक था इसलिए मैंने देखा कि पर्ल में "लॉक" क्या करता है और एक सीधा जवाब खोजने में असमर्थ रहा है (कम से कम ऐसा नहीं जिसे मैं पूरी तरह समझ सकता हूं)। http://perldoc.perl.org/functions/lock.htmlपर्ल में "लॉक" क्या करता है?


पूर्व:

यह सबसे अच्छा जवाब मैंने पाया है ताला बात

"एक साझा चर पर एक सलाहकार लॉक या संदर्भित वस्तु जब तक बात में निहित स्थानों लॉक गुंजाइश से बाहर चला जाता है। "


इसका क्या अर्थ है? फ़ाइलों को लॉक करने के लिए "लॉक" फ़ंक्शन का उपयोग नहीं किया जाता है क्योंकि मैंने जो कुछ भी पढ़ा है, उसके लिए "झुंड" का उपयोग करना है, तो "लॉक" का उपयोग किस लिए किया जाता है? क्या इसे थ्रेडिंग के साथ करना है और यह सुनिश्चित करना है कि एक ही समय में चल रही कई प्रक्रियाएं एक दूसरे में टक्कर न दें?

+0

कुछ जानकारी के लिए [यह थ्रेड] देखें [http://www.perlmonks.org/?node_id=579444) – Andrei

उत्तर

6

इसका प्राथमिक उद्देश्य मल्टीथ्रेडिंग के लिए है। यह एक साझा चर को लॉक करता है, जैसे कि यदि कोई अन्य थ्रेड lock पर कोशिश करता है, तो lock कॉल रिलीज़ होने तक अवरुद्ध हो जाएगा।

इसे समझने के लिए:

#!/usr/bin/perl 
use strict; 
use warnings; 

use threads; 
use threads::shared; 

my $lock_var : shared; 

sub worker_thread { 
    print threads -> self -> tid(). ": Waiting for lock\n"; 
    lock ($lock_var); 
    print threads -> self -> tid(). ": got lock, doing some pretend code\n"; 
    sleep rand(10); 
    #lock released when out of scope. 
} 

for (1..10) { 
    threads -> create (\&worker_thread); 
} 

foreach my $thr (threads -> list) { 
    $thr -> join(); 
} 

आप संसाधन नियंत्रण के लिए उपयोग कर सकते हैं या तो, एक पारस्परिक अपवर्जन बनाने के लिए, या आप जैसे लॉक करने के लिए उपयोग कर सकते हैं एक हैश जब आप इसे एक ही थ्रेड के बिना एक ही समय में अपडेट करना चाहते हैं।

आपको ध्यान रखना चाहिए कि - lock लागू नहीं है। lock के बावजूद आप अभी भी साझा चर को संशोधित कर सकते हैं। यह केवल lock फ़ंक्शन कॉल है जो परीक्षण करेगा यदि चर वर्तमान में अनलॉक है।

जब आप एक परिवर्तनीय हेरफेर कर रहे हैं, तो lock का उपयोग करना महत्वपूर्ण है। कोई भी परीक्षण जहां आप read->change->write यदि आप लॉक नहीं करते हैं तो आप दौड़ की स्थिति बना सकते हैं - आप यह सुनिश्चित नहीं कर सकते कि पढ़ने और लिखने के बीच, कोई अन्य धागा ऐसा नहीं करेगा।

आप Thread::Semaphore पर भी देखना चाहते हैं जो कुछ ऐसा ही करता है।

2

ताला फ़ाइल के मामले जिनमें से आप कुछ ज्ञान है होती दिखाई देती हैं:

  • जब आप flock($fh, LOCK_EX) or die $!; करते हैं, यह जब तक यह है कि फाइल पर एक ताला प्राप्त ब्लॉक कर देंगे। कोई भी दो हैंडल एक ही समय में उस फ़ाइल पर लॉक पकड़ सकता है।

  • जब आप lock $var; करते हैं, तो यह उस साझा चर पर लॉक प्राप्त होने तक अवरुद्ध हो जाएगा। कोई भी दो थ्रेड एक ही समय में उस साझा चर पर लॉक नहीं रख सकता है।

जैसा कि आप देख सकते हैं, दोनों कुछ मनमानी संसाधनों पर आपसी पहुंच प्रदान करने का साधन प्रदान करते हैं।

नोट्स:

  • साझा चर एक प्रक्रिया के भीतर मौजूद है, तो lock $var; केवल एक प्रक्रिया के भीतर समक्रमिकता प्रदान करता है। लेकिन इसका मतलब यह भी है कि इसे किसी भी नामित बाहरी संसाधनों (उदाहरण के लिए एक फ़ाइल) का उपयोग करने की आवश्यकता नहीं है।
संबंधित मुद्दे