2012-02-29 13 views
5

मेरे पास एक प्रोग्राम है जो दो अलग-अलग संचालन चलाता है और मैं उनके बीच चर साझा करना चाहता हूं।सी ++, प्रक्रियाओं या धागे के बीच डेटा साझा करने के लिए कैसे करें

फिलहाल, मैं कांटा प्रक्रियाओं के बजाय धागे का उपयोग कर रहा हूं लेकिन मुझे चर को साझा करने में समस्याएं आ रही हैं, भले ही मैंने उन्हें अस्थिर घोषित किया हो। अस्थिर रूप में साझा चर की घोषणा के द्वारा

boost::thread collisions_thread2(boost::bind(function_thread2); 

, लेकिन ऐसा लगता है कि function_thread2() फ़ंक्शन साझा चर पर परिवर्तन देखने के लिए सक्षम नहीं है:

मैं बढ़ावा कर के साथ की कोशिश की।

thread1: 

while(true){ 
//..do somet stuff 
check variable1 
} 

thread2: 

while(true){ 
do some other stuff 
check and write on variable1 
} 

तुम मुझे बता सकते हैं एक ट्यूटोरियल या आसानी से धागे के बीच चर साझा करने के लिए एक विधि:

मैं क्या करना चाहते हैं क्या कुछ की तरह है? बढ़ावा दे सकता है पुस्तकालय इस मामले में उपयोगी हो सकता है? क्या आपको लगता है कि फोर्क() का उपयोग करना बेहतर है?

मुझे पता है कि मुझे महत्वपूर्ण परिस्थितियों से बचने के लिए म्यूटेक्स का उपयोग करना है, लेकिन मैंने इसका कभी भी उपयोग नहीं किया।

+0

जांच करें कि [इस सवाल] (http://stackoverflow.com/questions/118199/c-thread-shared-data) में मदद करता है। और अंततः [बूस्ट थ्रेड सिंक्रनाइज़ेशन] (http://www.boost.org/doc/libs/1_49_0/doc/html/thread/synchronization.html) – jweyrich

+0

अस्थिरता के पास धागे –

+0

के साथ कुछ लेना देना नहीं है, आपको ' चर साझा करने के लिए अस्थिर '। वैश्विक चर डिफ़ॉल्ट रूप से साझा किए जाते हैं। लेकिन यह एक बुरी चीज है क्योंकि यह डेटा दौड़ को आसान बनाता है। जब आपके पास डेटा दौड़ होती है तो आप अपने प्रोग्राम को उचित रूप से व्यवहार करने की उम्मीद नहीं कर सकते हैं, इसलिए आप शायद इस तरह के कुछ प्रकार में चल रहे हैं। डेटा रेस का निदान करने में सहायता के लिए आपको अपना अधिक वास्तविक कोड पोस्ट करना होगा। – bames53

उत्तर

2

आप boost का उपयोग कर सकते हैं, तो आप boost::mutex उपयोग कर सकते हैं।

// mtx should be shared for all of threads. 
boost::mutex mtx; 

// code below for each thread 
{ 
    boost::mutex::scoped_lock lk(mtx); 
    // do something 
} 
2

यदि पॉज़िक्स थ्रेडिंग libs (जो मैं अनुशंसा करता हूं) का उपयोग कर तो pthread_mutex_t का उपयोग करें।

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; 

फिर, प्रत्येक सूत्र में आप डेटा का उपयोग सिंक्रनाइज़ करने के लिए चाहते हैं जब:

pthread_mutex_lock(&lock); 
//access the data 
pthread_mutex_unlock(&lock); 
1

किसी भी प्रकार का म्यूटेक्स लॉक या अनलॉक काम करेगा। जहां तक ​​अस्थिरता पर आपका प्रश्न चलता है, यह कीवर्ड विशेष रूप से बहु-थ्रेडेड प्रोग्राम जैसे आपके जैसे अच्छे अभ्यास है। लेकिन यह आपके द्वारा लॉक और अनलॉक करने के तरीके को प्रभावित नहीं करता है। अस्थिर बस संकलक को बताता है कि एक चर को अनुकूलित करने के लिए उदा। इसे एक रजिस्टर में डालकर। यहाँ एक बहुत अच्छा व्याख्या दी गई है:

http://drdobbs.com/cpp/184403766

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