मुझे मल्टीथ्रेडिंग के साथ अधिक अनुभव नहीं है और मैं एक सी प्रोग्राम लिख रहा हूं जो मुझे विश्वास है कि दो धागे में चलने के लिए उपयुक्त है। कार्यक्रम डेटा के लिए धारावाहिक बंदरगाह पर सुनेंगे, उपलब्ध होने पर नए डेटा को पढ़ और संसाधित करेगा, और अनुरोध किए जाने पर तीसरे पक्ष IPC api (यह भ्रमित रूप से नामित आईपीसी) के माध्यम से नवीनतम (अप्रासंगिक) मॉड्यूल को नवीनतम (अप्रासंगिक) मॉड्यूल पर प्रकाशित करेगा।मल्टीथ्रेडेड सी प्रोग्राम डिज़ाइन सहायता
आईपीसी के माध्यम से डेटा प्रकाशित करने के अनुरोध को प्राप्त करने के लिए, कार्यक्रम को IPC_listenwait (wait_time) कॉल करना होगा; फिर यदि प्रकाशित करने का अनुरोध प्राप्त होता है, तो "सुननेवाले" एक हैंडलर को नवीनतम डेटा प्रकाशित करने के लिए बुलाया जाता है।
एक विकल्प एक धागे की तरह में यह करने के लिए है:
for(;;) {
read_serial(inputBuffer);
process_data(inputBuffer, processedData); //Process and store
IPC_listenwait(wait_time); //If a request to publish is received during this,
} //then a handler will be invoked and the newest piece of
//processedData will be published to other modules
publishRequestHandler() { //Invoked when a message is received during IPC_listenwait
IPC_publish(newest(processedData));
}
और यह काम करता है, लेकिन आवेदन के लिए यह महत्वपूर्ण है कि कार्यक्रम नए डेटा प्रकाशित करने के लिए अनुरोध करने के लिए बहुत संवेदनशील है, और कहा कि प्रकाशित डेटा नवीनतम उपलब्ध है। ये लक्ष्य उपरोक्त से संतुष्ट नहीं हैं क्योंकि प्रक्रिया सुनने के बाद डेटा पहुंच सकता है और संदेश प्रकाशित करने के अनुरोध से पहले प्राप्त किया जाता है। या जब संदेश प्रकाशित करने का अनुरोध आने वाला है, तो प्रक्रिया पढ़ने/प्रसंस्करण हो सकती है, लेकिन अगली आईपीसी_लिस्टनवाइट कॉल तक इसे सेवा करने में सक्षम नहीं होगी।
readThread() {
for(;;) { //pseudocode
select();
read(inputBuffer);
process(inputBuffer, processedData);
}
}
और बस भेजे गए संदेशों के लिए सुन मुख्य थ्रेड है:
mainThread() {
IPC_listenwait(forever);
}
publishRequestHandler() { //Invoked when a message is received during IPC_listenwait
IPC_publish(newest(processedData));
}
केवल डिजाइन मैं के बारे में सोच सकते हैं एक धागा पढ़ने के लिए है, जो की तरह ही कुछ करना होगा करने के लिए है
क्या यह डिज़ाइन आप उपयोग करेंगे? यदि हां, तो क्या मुझे संसाधित डेटा लिखने या लिखने पर एक सेमफोर का उपयोग करने की आवश्यकता होगी?
क्या इससे मुझे अच्छी प्रतिक्रिया मिलेगी?
धन्यवाद
आह, दो बफर समाधान सरल लेकिन प्रतिभा है! धन्यवाद –