2012-10-08 16 views
9

क्या यह थ्रेडसेफ होने की गारंटी है/अप्रत्याशित परिणाम नहीं दे रहा है?इंटरलाक्ड। एक पूर्णांक सरणी में वृद्धि

Interlocked.Increment(ref _arr[i]); 

मेरे अंतर्ज्ञान मुझसे कहता है यह _arr [i] में मूल्य पढ़ने वास्तविक incrementing के साथ 'परमाणु' होने की गारंटी नहीं है, अर्थात नहीं है।

यदि मैं सोचने में सही हूं कि यह गलत है, तो मैं इसे कैसे ठीक कर सकता हूं? धन्यवाद।

+0

कौन या क्या '_arr [i]' में मूल्य पढ़ रही है? इस कोड को इसे पढ़ा नहीं है, यह यह atomically वृद्धि कर देता है क्योंकि है कि क्या 'Interlocked.Increment है 'करता है –

उत्तर

13

मान लीजिए कि कुछ भी i या _arr बदलता है, यह ठीक होना चाहिए।

एक सरणी को चर के संग्रह के रूप में माना जाता है; एक इंटरलॉक वृद्धि को उस तत्व या दूसरों को उसी सरणी में क्या हो रहा है, इस पर ध्यान दिए बिना ठीक काम करना चाहिए।

1

अगर कुछ है एसिंक्रोनस रूप से तो _arr या i बदल रहा है, मैं आपसे सहमत हूँ, नहीं, देखने _arr[i] जरूरी नहीं कि खुद को परमाणु है।

हालांकि, जॉन कहते हैं के रूप में, एक बार आप के लिए (कुछ) _arr, यह atomically वृद्धि की जाएगी, सरणी (रों) के अन्य तत्वों में हो रहा अन्य कार्यों के स्वतंत्र, या आगे बढ़ाने के लिए परिवर्तन का एक तत्व की पहचान की है _arr या i

तो _arr या i एसिंक्रोनस रूप से बदल दिया जा रहा है, उन्हें सभी संदर्भ (दोनों पढ़ने और लिखने) एक आम वस्तु पर एक lock अंदर होना चाहिए। (और फिर आप एक सरल ++ को Interlocked.Increment कम कर सकते हैं।

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