मैं वर्तमान में microcontrollers के लिए RTOS लिख रहा हूँ। पूरी बात C ++ 11 में लिखी गई है - अगर किसी को दिलचस्पी है, और रिपॉजिटरी का लिंक सबसे नीचे है।
वर्तमान में मैं एक वर्ग लिख रहा हूं जो थ्रेड्स के बीच (या बीच वाले हैंडलर और थ्रेड्स या इंटरप्ट हैंडलर और अन्य इंटरप्ट हैंडलर) के बीच ऑब्जेक्ट्स को पास करने के लिए एक सरल डेटा कतार है। आमतौर पर मैं अन्य परियोजनाओं पर पाए जाने वाले कुछ सामान्य एपीआई का पालन करने की कोशिश करता हूं, फिर भी मुझे समवर्ती कतार का कोई उदाहरण नहीं मिला है जिसमें emplace()
फ़ंक्शन और टाइमआउट का समर्थन हो।
मेरी सामान्य "समस्या" यह है कि मैं इन दो इंटरफेस के बीच फैसला नहीं कर सकता:
( std::chrono::duration<Rep, Period>
एक अस्थायी प्रकार है, मैं स्पष्टता के लिए टेम्पलेट बॉयलरप्लेट को छोड़ देता हूं)
पहला संस्करण:
template<typename T>
class FifoQueue
{
public:
...
template<typename... Args>
int tryEmplaceFor(std::chrono::duration<Rep, Period>, Args&&... args);
int tryPopFor(T&, std::chrono::duration<Rep, Period>);
int tryPushFor(const T&, std::chrono::duration<Rep, Period>);
int tryPushFor(T&&, std::chrono::duration<Rep, Period>);
...
}
दूसरा संस्करण:
template<typename T>
class FifoQueue
{
public:
...
template<typename... Args>
int tryEmplaceFor(std::chrono::duration<Rep, Period>, Args&&... args);
int tryPopFor(std::chrono::duration<Rep, Period>, T&);
int tryPushFor(std::chrono::duration<Rep, Period>, const T&);
int tryPushFor(std::chrono::duration<Rep, Period>, T&&);
...
}
( ...Until
प्रत्यय के साथ इन कार्यों का दूसरा सेट होगा - ये अवधि के बजाय समय-सीमा का उपयोग करेंगे)
पहला संस्करण अंतिम पैरामीटर के रूप में टाइमआउट होने के "सामान्य शैली" का अनुसरण करता है (उदाहरण POSIX संदेश कतारें हैं, std::condition_variable
और माइक्रोकंट्रोलर के लिए किसी भी आरटीओएस में सरल कतारें)। मुद्दा यह है कि tryEmplaceFor () फ़ंक्शन के लिए अंतिम समय के रूप में यह टाइमआउट तर्क होना संभव नहीं है, क्योंकि वैरिएड टेम्प्लेट के मामले में "ज्ञात" तर्क पहले (*) होना चाहिए। तो दूसरा संस्करण "सुसंगत" है - टाइमआउट वाले सभी कार्यों में पहले तर्क के रूप में टाइमआउट है। इस संस्करण में इस तरह की कार्यक्षमता के लिए पहले तर्क के रूप में टाइमआउट होने का पहला उदाहरण होने की एक स्पष्ट समस्या है।
कौन सा इंटरफ़ेस बेहतर ओएस की सेवा करेगा:
- पिछले तर्क के रूप में समय समाप्त होने के स्थापित मानक (के अपवाद के साथ
tryEmplaceFor()
औरtryEmplaceUntil()
- जहां यह पहला तर्क होना चाहिए (*))? - संगति - पहले तर्क होने के लिए टाइमआउट पसंद करते हैं?
(*) - मुझे पता है कि तकनीकी रूप से मैं अंतिम तर्क के रूप में समय समाप्त हो सकता है tryEmplaceFor()
और tryEmplaceUntil()
, लेकिन मैं इस तरह के सरल परिदृश्य के लिए इस तरह के टेम्पलेट जादू का उपयोग करने से बचूंगा - इन सभी पुनरावर्ती तात्कालिकता को करने के लिए बस अंतिम तर्क थोड़ा अधिक लगता है, विशेष रूप से जब मैं त्रुटियों का अनुमान लगाता हूं कि कंपाइलर उपयोगकर्ता के मामले में कुछ गलत करेगा ...