मेरे पास कुछ सरल सी-कोड है जो एकल वैश्विक चर का उपयोग करता है। जाहिर है यह थ्रेड-सुरक्षित नहीं है, इसलिए जब मैं इसे पी/इनवॉक का उपयोग करके सी # में एकाधिक थ्रेड से कॉल करता हूं, तो चीजें खराब हो जाती हैं।सी # (थ्रेड-सुरक्षित "से बुलाया गया सी (पी/इनवोक) कोड कैसे बनाएं
मैं या तो प्रत्येक थ्रेड के लिए अलग-अलग फ़ंक्शन कैसे आयात कर सकता हूं, या इसे थ्रेड-सुरक्षित बना सकता हूं?
मैंने परिवर्तनीय __declspec(thread)
घोषित करने का प्रयास किया, लेकिन इससे प्रोग्राम क्रैश हो गया। मैंने सी ++/सीएलआई कक्षा बनाने की भी कोशिश की, लेकिन यह सदस्य-कार्यों को __declspec(naked)
होने की अनुमति नहीं देता है, जिसे मुझे (मैं इनलाइन-असेंबली का उपयोग कर रहा हूं) की आवश्यकता है। मैं बहुत अनुभवी लेखन बहु-थ्रेडेड सी ++ कोड नहीं हूं, इसलिए कुछ ऐसा हो सकता है जो मुझे याद आ रही है।
सी #
[DllImport("MyDll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int SomeFunction(int parameter1, int parameter2);
सी ++
extern "C"
{
int someGlobalVariable;
int __declspec(naked) _someFunction(int parameter1, int parameter2)
{
__asm
{
//someGlobalVariable read/written here
}
}
int __declspec(dllexport) SomeFunction(int parameter1, int parameter2)
{
return _someFunction(parameter1, parameter2);
}
}
[संपादित करें]:का परिणाम
यहाँ कुछ उदाहरण कोड है 10 someGlobalVariable
(उदाहरण के बारे में सोचें) के आधार पर कुछ निर्धारित आदेश में जाना चाहिए। एक पीआरएनजी, someGlobalVariable
आंतरिक स्थिति के रूप में)। तो, एक म्यूटेक्स या अन्य प्रकार के लॉक का उपयोग करना एक विकल्प नहीं है - प्रत्येक थ्रेड की अपनी प्रति someGlobalVariable
की प्रतिलिपि होनी चाहिए।
आप इसे कितनी बार कहते हैं - क्या आप सी # पक्ष में लॉकिंग कर सकते हैं, मानते हैं कि आपके पास सी नहीं है कोड? –
@ स्टेवटाउनसेंड: नहीं, अधिकांशतः सभी सारे थ्रेड उस कार्य को कॉल करते हैं। –
क्या यह एक वैश्विक चर होना है? आप राज्य को फ़ंक्शन से वापस कर सकते हैं और किसी राज्य को अगली बार कॉल करने पर फ़ंक्शन पर वापस जाने की आवश्यकता होती है। (या राज्य के लिए एक सूचक।) – dtb