2012-06-15 17 views
5

मैं एक बहु-थ्रेड प्रोग्राम पर काम कर रहा हूं, और म्यूटक्स को परिभाषित करने के बारे में एक प्रश्न है।सी मल्टीथ्रेड प्रोग्राम में mutex को परिभाषित करने के लिए कहां?

प्रासंगिक जानकारी: कार्यक्रम में main.c है जहां हम उपयोगकर्ता इनपुट के अनुसार एक विशिष्ट कार्रवाई निर्धारित करते हैं। मुख्य एक मास्टर_फंक्शन कहते हैं जो master.c नाम की फ़ाइल में स्थित है। master.c फ़ाइल में हम कुछ अन्य कार्यों (प्रासंगिक नहीं) के साथ एन धागे बनाते हैं। थ्रेड्स son_threads नामक एक फ़ंक्शन को कॉल करते हैं जो son.c फ़ाइल में स्थित है और जब वे एक महत्वपूर्ण क्षेत्र में प्रवेश करते हैं तो एक म्यूटेक्स का उपयोग करने की आवश्यकता होती है (दौड़ की स्थिति को रोकने के लिए कई वैश्विक चर संपादित करना)। मेरे पास एक और फ़ाइल है type.h जहां मैं उपयोग करने के लिए आवश्यक कई वैश्विक चर परिभाषित करता हूं।

म्युटेक्स की घोषणा है:

pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER; 

तो मैं अपने type.h तो यह son.c फ़ाइलों को दिखाई दे म्युटेक्स को परिभाषित करने की कोशिश की। जब मैं संकलन करने की कोशिश करता हूं तो यह मुझे त्रुटि देता है। जो सही है क्योंकि मैं कई फ़ाइलों में उस म्यूटेक्स को परिभाषित कर रहा हूं।

लेकिन मुझे पूरा यकीन है कि मैं son.c फ़ाइल में म्यूटेक्स को परिभाषित नहीं कर सकता क्योंकि प्रत्येक बार जब मैं उस धागे को बनाता हूं, तो म्यूटेक्स को इसकी डिफ़ॉल्ट सेटिंग में प्रारंभ किया जाएगा, जिससे मुझे इसका सही उपयोग करने की अनुमति नहीं मिलती है। इसके बारे में निश्चित नहीं है।

म्यूटेक्स को वैश्विक चर होना चाहिए, जहां एन धागे के पास इसका उपयोग है। तो मुझे इसे कहां रखना है?

मुझे नहीं पता कि मैं खुद को सही समझा रहा हूं या नहीं। अपनी पूरी कोशिश कर रहा हूँ।

उत्तर

6

बस .h फ़ाइल

extern pthread_mutex_t mutex1; 

में अपने चर घोषित करने और सी फाइल में प्रारंभ के साथ परिभाषा रहते हैं। ऐसा इसलिए है क्योंकि यह सी मानक (ओं) से है।

पॉज़िक्स के लिए, स्थिर भंडारण के साथ म्यूटेक्स की शुरुआत वास्तव में महत्वपूर्ण है। तो यह परिभाषा .h फ़ाइल में नहीं रह सकती है।

1

यदि आपके पास वैश्विक चर होना चाहिए और इसे 'सी' में मॉड्यूल के बीच साझा करना है, तो मुझे लगता है कि यह एक फ़ाइल में शामिल होने के लिए विशिष्ट है। पुराने दिनों में हम .h फ़ाइल में "ग्लोबल" जैसे कुछ जादू मैक्रो का उपयोग "बाहरी" के रूप में करेंगे और मुख्य में हम ग्लोबल को फिर से परिभाषित करेंगे जैसे कि इसे मुख्य रूप में घोषित नहीं किया जाएगा।

#ifndef _TYPES_H 
#define _TYPES_H 

    // types.h 

    #ifndef GLOBAL 
    # define GLOBAL extern 
    #endif 

    GLOBAL my_global mutex; 


#endif 
+0

ठीक है मैं समझता हूं कि आपका क्या मतलब है। मुझे देखने दो कि यह कैसे काम करता है। सलाह के लिए धन्यवाद! – Alessandroempire

+0

मुझे नहीं लगता कि 'ग्लोबल' वाला गेम यहां परोसता है। आपको '.h' फ़ाइल में एक घोषणा की आवश्यकता है और' .c' में प्रारंभिक * के साथ एक परिभाषा * की आवश्यकता है। 'Pthread_mutex_t' के लिए डिफ़ॉल्ट प्रारंभ नहीं होगा। –

+0

@ जेन्स गस्टेड ने ठीक वही किया जो मैंने अभी किया और यह काम किया। मैंने नोटिस नहीं किया था कि मैं .h फ़ाइल में mutex प्रारंभ कर रहा था। बहुत बड़ी गलती। – Alessandroempire

2

लेकिन मैं यकीन है कि मैं नहीं कर सकते son.c फ़ाइल में म्युटेक्स परिभाषित क्योंकि हर बार मुझे लगता है कि धागा बनाने के लिए, म्युटेक्स उसकी डिफ़ॉल्ट सेटिंग में प्रारंभ किया जाएगा, मुझे यह ठीक से उपयोग करने की अनुमति नहीं कर रहा हूँ । इसके बारे में निश्चित नहीं है।

यह सही नहीं है। उस फ़ाइल में mutex परिभाषा रखो, लेकिन थ्रेड फ़ंक्शन के बाहर। इसे प्रोग्राम स्टार्टअप में शुरू किया जाएगा, लेकिन प्रत्येक नए धागे पर नहीं। आप हेडर फाइलों में से एक में extern pthread_mutex_t mutex1; डाल सकते हैं ताकि म्यूटेक्स के किसी भी उपयोगकर्ता जो son.c में नहीं हैं mutex के बारे में जानते हैं।

+0

यह मेरा संदेह था! मैंने सोचा कि हर बार जब मैं एक नया धागा बनाउंगा, तो यह सिर्फ म्यूटेक्स को रीसेट करेगा, अच्छी खबर है। आपका बहुत बहुत धन्यवाद! – Alessandroempire

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