2012-03-24 13 views
7

सुनिश्चित नहीं है कि धागे की सुरक्षा ||= पर भी लागू होती है।है || = रूबी धागे में सुरक्षित?

मूल रूप से लगभग ActiveSupport::Memoizable पढ़ रहा था और वहां थ्रेड सुरक्षा के बारे में सोच रहा था।

+1

क्या आपका मतलब है "क्या यह परमाणु संचालन है?", "परीक्षण और असाइनमेंट के बीच देरी हो सकती है", फिर नहीं, मुझे ऐसी कोई गारंटी दिखाई नहीं दे रही है। – j13r

+3

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

+0

मुझे लगता है कि मैं क्या पूछना चाहता था क्या मुझे थ्रेड के साथ '|| =' का उपयोग करके परेशानी हो जाएगी? –

उत्तर

1

यह कार्यान्वयन पर निर्भर करता है। ध्यान रखें कि x ||= yx || x = y तक फैला है, और x = y केवल x है या तो false और न ही nil है।

इसके साथ, रुबी भाषा का सी कार्यान्वयन पूरी तरह से थ्रेड सुरक्षित होना चाहिए।

YARV समरूपता को लागू करने के लिए देशी धागे का उपयोग करता है, जो सही समांतर में चलाया जाता है। हालांकि, पिछड़े संगतता को बनाए रखने के लिए, global, interpreter-wide lock पेश किया गया था।

जेआरबी, हालांकि, आपके कोड पर कोई आंतरिक लॉकिंग नहीं लगाता है, इसलिए आवश्यक होने पर मैन्युअल रूप से आपकी कॉल सिंक्रनाइज़ करना चाहिए।

अधिक जानकारी के लिए another answer I've given about the subject देखें। इसके अलावा, विभिन्न रूबी कार्यान्वयन के थ्रेडिंग मॉडल पर अधिक गहराई से देखने के लिए this excellent answer by Jörg W Mittag पढ़ें।

0

लुका गुइडी द्वारा thread safety concepts in Ruby पर यह शानदार पोस्ट दिखाती है कि ||= थ्रेड-सुरक्षित नहीं है (कम से कम एमआरआई में)।

+0

क्या यह केवल '@ instance' चर के लिए ही सही है? या उस पद्धति के भीतर कोई नया धागा नहीं बनाया गया है, तो विधि चर के लिए अभी भी सुरक्षित हो सकता है? – Kelseydh

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