2010-06-10 4 views
12

lua_lock और lua_unlock का मुद्दा क्या है?lua_lock और lua_unlock का उद्देश्य?

निम्नलिखित यह महत्वपूर्ण है का अर्थ है:

LUA_API void lua_gettable (lua_State *L, int idx) { 
    StkId t; 
    lua_lock(L); 
    t = index2adr(L, idx); 
    api_checkvalidindex(L, t); 
    luaV_gettable(L, t, L->top - 1, L->top - 1); 
    lua_unlock(L); 
} 


LUA_API void lua_getfield (lua_State *L, int idx, const char *k) { 
    StkId t; 
    TValue key; 
    lua_lock(L); 
    t = index2adr(L, idx); 
    api_checkvalidindex(L, t); 
    setsvalue(L, &key, luaS_new(L, k)); 
    luaV_gettable(L, t, &key, L->top); 
    api_incr_top(L); 
    lua_unlock(L); 
} 

निम्नलिखित यह कुछ नहीं करता है का अर्थ है:

#define lua_lock(L)  ((void) 0) 
#define lua_unlock(L) ((void) 0) 

कृपया प्रबुद्ध।

उत्तर

19

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

यह वेनिला लुआ में नो-ऑप को परिभाषित किया गया है, क्योंकि वेनिला लुआ 100% एएनएसआई-सी है और एक थ्रेड में चलता है: किसी भी लॉकिंग तंत्र को लागू करने की आवश्यकता नहीं है। हालांकि, डेवलपर्स ने लूआ बंदरगाहों और दुभाषिया में थ्रेडिंग लागू करने वाले लोगों के लिए लॉक स्टेटमेंट डालना चुना।

सूत्रों का कहना है:

+0

इस म्युटेक्स संरक्षित अन्य archs पर होने की जरूरत है, तो क्यों यह 86 पर 64-बिट Ubuntu पर आवश्यक नहीं है ? [जिस प्रणाली पर मैं चल रहा हूं] – anon

+0

यदि आप लूआ एपीआई को एकाधिक थ्रेड से उसी 'lua_State' के लिए बुलाए जाने की अनुमति देते हैं, तो आपको * उचित' lua_lock' और 'lua_unlock' को परिभाषित करना होगा। डिफ़ॉल्ट बिल्ड ऐसा नहीं करता है क्योंकि यह सबसे आम सिंगल-थ्रेड केस के लिए प्रदर्शन को नुकसान पहुंचाता है, इसलिए आप एकाधिक थ्रेड से एकल 'lua_State' का उपयोग नहीं कर सकते हैं। – RBerteig

+3

यदि आप एकाधिक धागे स्वयं को लागू करते हैं तो आपको अभी भी सावधान रहना होगा। यदि दो धागे एक ही समय में एक टेबल पर फिर से प्रयास करने का प्रयास करते हैं तो lua_lock और lua_unlock पर्याप्त नहीं होंगे। –

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