समाधान में है कि एप्पल दस्तावेज़ में वर्णित:
- कोई बफर क्योंकि कोई बफर की जरूरत है नहीं है;
- सिस्टम लोड बाध्य है;
- उपभोक्ता कार्य हैं।
कहें कि आपके पास कई उत्पादक और उपभोक्ता हैं, निर्माता एक साझा बफर में डेटा डालते हैं और उपभोक्ता उस साझा बफर से डेटा पढ़ते हैं। एक सेफफोरे या मॉनिटर का उपयोग साझा बफर तक पहुंच को सिंक्रनाइज़ करने के लिए किया जाता है, और बफर आकार तय किया जाता है ताकि उत्पादित होने वाली दर के अनुसार उत्पादित होने वाली मात्रा की मात्रा को सीमित किया जा सके, इसलिए निर्माता को थ्रोटलिंग किया जा सके।
ग्रैंड सेंट्रल डिस्पैच के तहत, उपभोक्ता एक कतार में भेजे गए कार्य हैं। चूंकि कार्य उद्देश्य-सी ब्लॉक हैं, इसलिए किसी निर्माता को डेटा को डेटा के बारे में बताने के लिए बफर की आवश्यकता नहीं होती है: उद्देश्य-सी ब्लॉक स्वचालित रूप से उन वस्तुओं को कैप्चर करते हैं जिन्हें वे संदर्भित करते हैं।
उदाहरण के लिए:
// Producer implementation
while (…) {
id dataProducedByTheProducer;
// Produce data and place it in dataProducedByTheProducer
dataProducedByTheProducer = …;
// Dispatch a new consumer task
dispatch_async(queue, ^{
// This task, which is an Objective-C block, is a consumer.
//
// Do something with dataProducedByTheProducer, which is
// the data that would otherwise be placed in the shared
// buffer of a traditional, semaphore-based producer-consumer
// implementation.
//
// Note that an Objective-C block automatically keeps a
// strong reference to any Objective-C object referenced
// inside of it, and the block releases said object when
// the block itself is released.
NSString *s = [dataProducedByTheProducer …];
});
}
निर्माता डेटा यह उत्पादन कर सकते हैं के रूप में कई उपभोक्ता कार्य कर सकती हैं। हालांकि, इसका मतलब यह नहीं है कि जीसीडी उपभोक्ता कार्यों को उसी दर पर आग लगाएगी। जीसीडी मौजूदा सिस्टम लोड के अनुसार निष्पादित कार्यों की मात्रा को नियंत्रित करने के लिए ऑपरेटिंग सिस्टम की जानकारी का उपयोग करता है। निर्माता खुद को थ्रॉटल नहीं किया जाता है, और ज्यादातर मामलों में यह जीसीडी के आंतरिक भार संतुलन के कारण नहीं होना चाहिए।
यदि बहुत निर्माता रुके वास्तविक जरूरत, एक समाधान (अपना काम समाप्त हो गया है एक काम है कि उपभोक्ता के बाद भेजा है के माध्यम से) एक मास्टर कि n निर्माता कार्यों प्रेषण और प्रत्येक उपभोक्ता मास्टर को सूचित करना होगा है कि यह समाप्त हो गया है, इस मामले में मास्टर एक और निर्माता कार्य भेज देगा। वैकल्पिक रूप से, उपभोक्ता स्वयं पूरा होने पर निर्माता कार्य भेज सकता है।
विशेष रूप से आइटम आप को सुलझा लिया है का जवाब दे:
निर्माता-उपभोक्त समस्या भी घिरा-बफर समस्या के रूप में जाना जाता है, फिर भी ऊपर एक बफर
ए का कोई जिक्र नहीं है साझा बफर की आवश्यकता नहीं है क्योंकि उपभोक्ता उद्देश्य-सी ब्लॉक हैं, जो संदर्भित डेटा को स्वचालित रूप से कैप्चर करते हैं।
अपनी बाध्य
GCD मौजूदा प्रणाली लोड के अनुसार भेजा कार्यों की संख्या सीमा।
या उपभोक्ता
उपभोक्ताओं कार्यों GCD कतारों के लिए भेजा है।
क्रम में निर्माता & उपभोक्ता को अवरुद्ध से अधिक से बचने के लिए/के अधीन ही कार्य
अवरुद्ध कोई साझा किए गए बफर वहाँ के बाद से के लिए कोई ज़रूरत नहीं है अकेले। चूंकि प्रत्येक उपभोक्ता उद्देश्य-सी ब्लॉक संदर्भ कैप्चरिंग तंत्र के माध्यम से उत्पादित डेटा को कैप्चर करने वाला एक उद्देश्य-सी ब्लॉक है, उपभोक्ता और डेटा के बीच एक-से-एक संबंध है।
लेकिन इस मामले में केवल एक प्रदर्शन हिट परिप्रेक्ष्य से बेहतर होगा, जिसमें निर्माता और उपभोक्ता एक साथ चलने वाले 2 धागे होते हैं, सिस्टम इनिट के दौरान शुरू होते हैं या जीसीडी मार्ग पर जाते हैं जो उत्पादक के पास अधिक डेटा जोड़ने के लिए एसिंक थ्रेड भेज देगा (चूंकि धागे को प्रेषित करने से भी अपना प्यारा समय लगता है)। – Ichthyocentaurs
कतार बफर है। –