2009-11-18 16 views
10

बूस्ट थ्रेड लाइब्रेरी java.util.concurrent लाइब्रेरीज़ के विरुद्ध तुलना कैसे करते हैं?java.util.concurrent बनाम बूस्ट थ्रेड्स लाइब्रेरी

प्रदर्शन महत्वपूर्ण है और इसलिए मैं सी ++ के साथ रहना पसंद करूंगा (हालांकि जावा इन दिनों बहुत तेज है)। यह देखते हुए कि मुझे सी ++ में कोड करना है, थ्रेडिंग को आसान और कम त्रुटि प्रवण बनाने के लिए कौन सी लाइब्रेरी मौजूद हैं।

मैंने हाल ही में सुना है कि जेडीके 1.5 के रूप में, जावा मेमोरी मॉडल को कुछ समरूप मुद्दों को ठीक करने के लिए बदला गया था। सी ++ के बारे में कैसे? आखिरी बार जब मैंने सी ++ में बहुप्रचारित प्रोग्रामिंग किया था तो 3-4 साल पहले जब मैंने पाथ्रेड का इस्तेमाल किया था। हालांकि, मैं अब एक बड़ी परियोजना के लिए इसका उपयोग नहीं करना चाहता हूं। एकमात्र अन्य विकल्प जो मुझे पता है बूस्ट थ्रेड है। हालांकि, मुझे यकीन नहीं है कि यह अच्छा है या नहीं। मैंने java.util.concurrent के बारे में अच्छी बातें सुनी हैं, लेकिन अभी तक बूस्ट धागे के बारे में कुछ भी नहीं है।

+7

मार्टिन, मुझे लगता है कि इसका मतलब है – zedoo

+7

मेरे अनुभव में किसी भी समय कोई कहता है कि "निष्पादन महत्वपूर्ण है" बिना किसी विनिर्देश के यह वास्तव में महत्वपूर्ण नहीं है। प्रदर्शन कारणों से सी ++ या जावा को पसंद न करें, सी ++ या जावा चुनें क्योंकि आप इससे अधिक परिचित हैं या आपको प्रोग्राम करना आसान लगता है। –

उत्तर

10

बूस्ट धागे pthreads से उपयोग करने के लिए बहुत आसान हैं, और, मेरी राय में, जावा धागे से उपयोग करने के लिए थोड़ा आसान है। जब एक बूस्ट थ्रेड ऑब्जेक्ट को तुरंत चालू किया जाता है, तो यह एक नया धागा लॉन्च करता है। उपयोगकर्ता एक फ़ंक्शन या फ़ंक्शन ऑब्जेक्ट प्रदान करता है जो उस नए थ्रेड में चलाएगा।

boost::thread* thr = new boost::thread(MyFunc()); 
thr->join(); 

आप आसानी से समारोह ऑब्जेक्ट के अंदर मूल्यों भंडारण के द्वारा धागा को डेटा पास कर सकते हैं:

यह रूप में वास्तव में के रूप में आसान है। और बूस्ट के नवीनतम संस्करण में, आप धागे कन्स्ट्रक्टर के लिए तर्कों की एक चर संख्या को पारित कर सकते हैं, जो तब आपके फ़ंक्शन ऑब्जेक्ट के () ऑपरेटर को पास कर दिया जाएगा।

आप सिंक्रनाइज़ेशन के लिए boost::mutex के साथ RAII-शैली लॉक का भी उपयोग कर सकते हैं।

ध्यान दें कि C++ 0x std::thread के लिए समान वाक्यविन्यास का उपयोग करेगा।

+1

आईएमएचओ जावा कंसुरेंसी लाइब्रेरी का उद्देश्य जावा थ्रेड्स (जो pthreads पर आधारित हैं) से बहु-थ्रेडिंग आसान बनाना है –

+0

@ पीटर Lawrey pthreads के साथ क्या गलत है? जब तक आप जावा में समवर्ती संग्रहों के बारे में बात नहीं कर रहे थे, तब हाँ वे pthreads में असंभव हैं। –

+1

@IgorGanapolsky pthreads के साथ कुछ भी गलत नहीं है। मैं इस बिंदु को बना रहा था कि जावा थ्रेड के साथ बूस्ट की तुलना करना बूस्ट की तुलना में java.util.concurrent के साथ तुलना नहीं है जो 2006 में जोड़ा गया था और ये बहुत आसान हैं। समांतरस्ट्रीम() एपीआई फिर से बहुत आसान है। –

1

यदि आप एक विशिष्ट प्लेटफार्म को लक्षित कर रहे हैं तो सीडी ओएस कॉल सी ++ के लिए बूस्ट का उपयोग करने से थोड़ा तेज होगा। मैं एसीई का उपयोग करता हूं, क्योंकि आप आम तौर पर अपने मुख्य मंच के लिए सही कॉल कर सकते हैं और यह अभी भी प्लेटफ़ॉर्म-स्वतंत्र होगा। जावा एक ही गति के बारे में होना चाहिए जब तक कि आप गारंटी दे सकें कि यह हाल के संस्करण पर चल रहा है।

+2

Boost.thread एकमात्र कारण के लिए एसीई से तेज़ है जो टेम्पलेट का उपयोग करता है। बूस्ट और एसीई दोनों एक ही ओएस कॉल का उपयोग करते हैं। बूस्ट का संकलित कोड, हालांकि, मूल पैथ्रेड का उपयोग करके आप जो लिखेंगे, उसके बहुत करीब है। जबकि देशी ओएस प्राइमेटिव को छूने से पहले एसीई को अमूर्त परतों के माध्यम से क्रॉल करना पड़ता है। जावा में एक समान समस्या होगी लेकिन JVM अबास्ट्रक्शन लागतों के अधिकांश (सभी?) को हटाने में सक्षम है। –

+0

यह मत भूलना कि एसीई क्रॉस प्लेटफार्म संचार पर केंद्रित है और रिएक्टर/प्रोक्टर फ्रेमवर्क जैसे कई उच्च स्तरीय अबास्ट्रक्शन जोड़ता है। तो उस दृष्टिकोण से इसे बढ़ावा देने पर प्राथमिकता दी जा सकती है। – count0

7

प्रदर्शन के अनुसार मैं वास्तव में चिंता नहीं करता। यह मेरा आंत महसूस कर रहा है कि एक बूस्ट/सी ++ विशेषज्ञ जावा विशेषज्ञ की तुलना में तेज़ कोड लिख सकता है। लेकिन किसी भी फायदे के लिए लड़ा होगा।

मैं जावा के बूस्ट के डिजाइन प्रतिमान पसंद करता हूं। जावा ओओ सभी तरह से है, जहां बूस्ट/सी ++ ओओ के लिए अनुमति देता है यदि आप पसंद करते हैं लेकिन समस्या के लिए सबसे उपयोगी प्रतिमान का उपयोग करते हैं। ताले से निपटने पर विशेष रूप से मैं आरएआईआई से प्यार करता हूं। जावा मेमोरी मैनेजमेंट को खूबसूरती से संभालता है, लेकिन कभी-कभी ऐसा लगता है कि बाकी प्रोग्रामर के संसाधन शाफ्ट हो जाते हैं: फ़ाइल हैंडल, म्यूटेक्स, डीबी, सॉकेट इत्यादि

जावा की समवर्ती लाइब्रेरी बूस्ट की तुलना में अधिक व्यापक है। थ्रेड पूल, समवर्ती कंटेनर, परमाणु इत्यादि। लेकिन मूल प्राइमेटिव एक-दूसरे, धागे, म्यूटेक्स, हालत चर के बराबर हैं।

तो प्रदर्शन के लिए मैं कहूंगा कि यह एक धो है। यदि आपको बहुत से उच्च स्तरीय समवर्ती लाइब्रेरी समर्थन जावा जीतने की आवश्यकता है। यदि आप प्रतिमान स्वतंत्रता सी ++ पसंद करते हैं।

12

java.util.concurrent और boost threads library में ओवरलैपिंग कार्यक्षमता है, लेकिन java.util.concurrent भी उच्च स्तर के abstractions प्रदान करता है और बी) निम्न स्तर के कार्यों भी।

बूस्ट धागे प्रदान करते हैं:

java.util.concurrent भी है:

एक साइड नोट: सी ++ में वर्तमान में कोई मेमोरी मॉडल नहीं है। एक अलग मशीन पर एक ही सी ++ एप्लिकेशन को एक अलग मेमोरी मॉडल से निपटना पड़ सकता है। यह सी ++ में पोर्टेबल, समवर्ती प्रोग्रामिंग को और भी मुश्किल बनाता है।

0

सी ++ में कोई भी सीधे pthreads (pthread_create() आदि का उपयोग कर सकता है यदि कोई चाहता था। आंतरिक रूप से जावा अपने रन-टाइम पर्यावरण के माध्यम से pthreads का उपयोग करता है। देखने के लिए "ldd" करो।

4

यदि प्रदर्शन आपके मल्टीथ्रेड प्रोग्राम में कोई समस्या है, तो आपको लॉक-फ्री डिज़ाइन पर विचार करना चाहिए।
लॉक-फ्री का मतलब है कि धागे साझा संसाधन के लिए प्रतिस्पर्धा नहीं करते हैं और जो स्विचिंग लागत को कम करता है। उस विभाग में, जावा के समवर्ती संग्रह के साथ आईएमएचओ की एक बेहतर कहानी है। आप तेजी से लॉक-मुक्त समाधान के साथ आ सकते हैं।
बूस्ट थ्रेड lib का उपयोग थोड़ा सा (लेकिन व्यापक रूप से नहीं) करने के लिए, मैं कह सकता हूं कि आपकी सोच जो उपलब्ध है उससे प्रभावित होगी, और इसका मतलब अनिवार्य रूप से लॉकिंग समाधान है।
लाइब्रेरी समर्थन की कमी और अवधारणात्मक रूप से लॉक-फ्री सी ++ समाधान लिखना बहुत मुश्किल है क्योंकि इसमें एक मेमोरी मॉडल गुम है जो गारंटी देता है कि आप वास्तव में अपरिवर्तनीय वस्तुएं लिख सकते हैं।

इस पुस्तक पढ़ने के लिए चाहिए: "। जावा एक बहुत तेजी से होता है की तुलना में यह पहले था" Java Concurrency in Practice

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