मल्टीथ्रेड प्रोग्रामिंग के बारे में जानने के लिए बहुत कुछ लगता है और यह सब कुछ डरावना है।एक पूरी विधि थ्रेड-सुरक्षित बनाने का सबसे आसान तरीका?
मेरे वर्तमान आवश्यकताओं के लिए, मैं सिर्फ एक विधि के खिलाफ की रक्षा करने के लिए एक और धागा से फिर से बुलाया जा रहा है इससे पहले कि यह खत्म चाहते हैं, और मेरे सवाल यह है:
इस है एक पर्याप्त (सुरक्षित) जिस तरह से एक बनाने के लिए विधि धागा-सुरक्षित?
class Foo
{
bool doingWork;
void DoWork()
{
if (doingWork) // <- sophistocated thread-safety
return; // <-
doingWork = true;
try
{
[do work here]
}
finally
{
doingWork = false;
}
}
}
अगर वह पर्याप्त नहीं है, क्या सबसे आसान तरीका है इस लक्ष्य को हासिल करने के लिए है?
संपादित करें: परिदृश्य के बारे में अधिक जानकारी:
फू उसमें केवल एक ही नहीं है
Foo.DoWork() पर एक ThreadPool धागे से बुलाया जाएगा सिस्टम की घटना की घटना समाप्त हो गई। टाइमर। टाइमर।
आम तौर पर Foo.DoWork() अगली बार कहा जाता है से पहले युगों खत्म हो जाएगा, लेकिन मैं पतली संभावना है कि यह लंबे समय चलेंगे, और समाप्त करने से पहले फिर से बुलाया पाने के लिए कोड करना चाहते हैं।
(मैं भी बहुत चालाक यकीन है कि इस सवाल का भाषा-नास्तिक टैग किया जा सकता है अगर होना करने के लिए नहीं कर रहा हूँ, इसलिए मैं नहीं किया है। प्रबुद्ध पाठकों, इसलिए यदि लागू करने के लिए स्वतंत्र महसूस हो रहा है।)
क्या प्रत्येक थ्रेड के लिए फू तत्काल प्रकार का ऑब्जेक्ट है, या इसे एकाधिक धागे में साझा किया गया है? – NotMe
डॉकवर्क विधि को कॉल करने वाले कोड के बारे में अधिक जानकारी दें, क्या कई धागे हैं? – sll
या तो फिर से प्रवेश करें या अपना कोड डिज़ाइन करें ताकि ऐसा न हो।जब ऐसा होता है तो बस बाहर निकलना सही समाधान होने की संभावना नहीं है। लेकिन आपका संपादन यह स्पष्ट करता है कि थ्रेड सुरक्षा वास्तव में मुद्दा है कि फिर से प्रवेश। –