2011-01-11 11 views
27

संक्षेप में, रूबी थ्रेड-सुरक्षित में मानक लाइब्रेरी Logger कक्षा है? Google की केवल उपयोगी जानकारी एक फोरम पर थी जिसे यह "थ्रेड" सुरक्षित लगता है। और मुझे लगता है कि यह पता लगाने की कोशिश करने के लिए एक लॉगर का परीक्षण करने में समय बिताना पसंद नहीं है।क्या रूबी का stdlib लॉगर क्लास थ्रेड-सुरक्षित है?

उस समय के लिए मैं log4r का उपयोग कर रहा हूं जो थ्रेड-सुरक्षित है, लेकिन यह मानक है कि मानक लाइब्रेरी पहले से ही करता है।

उत्तर

44

logger.rb पर एक त्वरित दृष्टि जैसे कि निम्न कोड का पता चलता है:

def write(message) 
    @mutex.synchronize do 
    if @shift_age and @dev.respond_to?(:stat) 
     begin 
     check_shift_log 
     rescue 
     raise Logger::ShiftingError.new("Shifting failed. #{$!}") 
     end 
    end 
    @dev.write(message) 
    end 
end 

इसलिए जब मैं चाहे वह धागे की सुरक्षा सही हो जाता पुष्टि नहीं कर सकते, मैं पुष्टि कर सकता है कि यह कर रहा है इसे सही करने के लिए एक समेकित प्रयास!

पीएस कोड को पढ़कर अपने लिए इस तरह के सवालों का जवाब देना अक्सर आसान होता है :-)

-1

नीचे मेरी मूल प्रतिक्रिया है, जो वास्तव में गलत है। नीचे निमो 157 की टिप्पणी पढ़ें। मैंने इसे केवल संदर्भ के लिए छोड़ दिया।

मूल:

मैं यह मायने रखता है नहीं लगता। रुबी के सभी कार्यान्वयन जिन्हें मैं अभी तक एक समय में एक धागे को प्रभावी ढंग से चलाने के बारे में जानता हूं: यह आपको कई धागे शुरू करने की अनुमति देता है, लेकिन प्रति प्रक्रिया एक समय में केवल एक धागा चलता है।

+8

हां, लेकिन भले ही केवल एक थ्रेड एक समय में चलता है जो बहु-थ्रेडेड रूबी कोड थ्रेड-सुरक्षित नहीं बनाता है क्योंकि परमाणु संचालन क्या हो सकता है, कई बयान फैल सकता है। जैसे 'x = point.x; point.x = x + 1', थ्रेड को दो कथनों के बीच बाधित किया जा सकता है और दूसरा धागा 'point.x' के मान को संशोधित कर सकता है जो इस धागे को फिर से शुरू होने पर अधिलेखित किया जाएगा। जावा जेड का उपयोग करने के साथ ही JRuby वास्तव में बहु-थ्रेडेड है। – Nemo157

+0

अच्छा बिंदु। मैंने संदर्भ के रूप में अपनी मूल प्रतिक्रिया छोड़ दी। – kirakun

0

कुछ रूबी वर्गों को थ्रेड सुरक्षित होने के लिए डिज़ाइन किया गया है, लेकिन स्पष्ट रूप से उनके दस्तावेज़ में एक अक्षर के शब्दों में ऐसा नहीं कहें। पीएचपी जैसी अन्य प्रोग्रामिंग भाषाओं में प्रलेखन के विपरीत।

मुझे यह याद रखना याद है कि Queue स्टैक ओवरफ़्लो पर थ्रेड-सुरक्षित था, और फिर भी, दस्तावेज़ों ने इसका जादू नहीं किया था।

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