2012-12-06 18 views
8

कुछ लोग बूस्ट :: बाइंड() फ़ंक्शन का उपयोग करके बूस्ट :: थ्रेड लॉन्च करना प्रतीत करते हैं, जैसे निम्न प्रश्न के स्वीकृत उत्तर में:बढ़ावा देने के साथ बूस्ट :: थ्रेड :: बाइंड() या इसके बिना

Using boost thread and a non-static class function

जबकि अन्य लोगों को इस सवाल का सबसे upvotes के साथ जवाब में बिल्कुल भी उसका उपयोग नहीं करते, जैसे:

Best way to start a thread as a member of a C++ class?

तो, क्या अंतर है, यदि वह मौजूद है?

+0

तो मुझे लगता है तुम सच में खत्म हो गया (देशी) पी धागे पूछ रहे हैं धागे के लिए क्यों उपयोग बूस्ट? – ScoPi

+2

@ScoPi: नहीं, मुझे लगता है कि वह पूछ रहा है कि 'बूस्ट :: थ्रेड' कन्स्ट्रक्टर को केवल सभी काम करने की बजाय 'बांध' का उपयोग क्यों करें। (और मुझे पूरा यकीन है कि आपको 'bind' का उपयोग करने की आवश्यकता है यदि आप 'shared_ptr' का उपयोग करके थ्रेड शुरू करना चाहते हैं।) –

उत्तर

9

आपको लगता है कि संकलन नीचे कोड से देख सकते हैं और उम्मीद उत्पादन देता है सकते हैं, को बढ़ावा देने :: बाँध मुक्त काम करता है, सदस्य कार्यों और स्थिर सदस्य कार्यों के साथ बढ़ावा :: धागा प्रयोग करने के लिए पूरी तरह से अनावश्यक है:

#include <boost/thread/thread.hpp> 
#include <iostream> 

void FreeFunction() 
{ 
    std::cout << "hello from free function" << std::endl; 
} 

struct SomeClass 
{ 
    void MemberFunction() 
    { 
    std::cout << "hello from member function" << std::endl; 
    } 

    static void StaticFunction() 
    { 
    std::cout << "hello from static member function" << std::endl; 
    } 
}; 

int main() 
{ 
    SomeClass someClass; 

    // this free function will be used internally as is 
    boost::thread t1(&FreeFunction); 
    t1.join(); 

    // this static member function will be used internally as is 
    boost::thread t2(&SomeClass::StaticFunction); 
    t2.join(); 

    // boost::bind will be called on this member function internally 
    boost::thread t3(&SomeClass::MemberFunction, someClass); 
    t3.join(); 
} 

आउटपुट:

hello from free function 
hello from static member function 
hello from member function 

निर्माता में आंतरिक बाँध आप के लिए सभी काम करता है।

बस प्रत्येक फ़ंक्शन प्रकार के साथ क्या होता है, इसके बारे में कुछ अतिरिक्त टिप्पणियां जोड़ दी गईं। (उम्मीद है कि मैंने स्रोत को सही तरीके से पढ़ा है!) जहां तक ​​मैं देख सकता हूं, बूस्ट :: बाइंड का उपयोग करके बाहरी रूप से इसे डबल अप करने और आंतरिक रूप से कॉल करने का कारण नहीं बनता है क्योंकि यह इस तरह से गुजरता है।

+1

तो लोग इसका उपयोग क्यों करते हैं? इस बढ़ावा :: asio उदाहरण बाँध() भी उपयोग करता है: http://www.boost.org/doc/libs/1_52_0/doc/html/boost_asio/example/chat/chat_client.cpp – deinocheirus

+0

@ user1613 यह संस्करण पर निर्भर कर सकता है बढ़ावा देने के लिए। 'Std :: bind' के बिना संस्करण को किसी प्रकार का विविध टेम्पलेट इम्यूलेशन की आवश्यकता होती है। – juanchopanza

+0

यह कम से कम रूप में वापस दूर Boost.Thrads पर एंथनी विलियम्स डॉ डोब्स लेख 2008 occording के रूप में समर्थन किया गया है: http://www.drdobbs.com/cpp/whats-new-in-boost-threads/211600441 मुझे लगता होगा लोग पूरी तरह से आदत से बाहर करते हैं। स्रोत को देखे बिना, इसका मतलब है कि बूस्ट :: बाइंड को दो बार बुलाया जाता है यदि आप इसे बाहरी रूप से उपयोग करते हैं। – goji

1

boost::bind का उपयोग किसी सदस्य फ़ंक्शन को थ्रेड पर बांधने के लिए किया जाता है, जबकि बिना बढ़ावा के :: आमतौर पर बाध्य के साथ आप स्थिर फ़ंक्शन या फ़्री फ़ंक्शन का उपयोग कर रहे हैं।

0

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

प्रस्तावित विकल्प (आपके द्वारा लिंक किया गया दूसरा प्रश्न) एक स्थिर विधि का उपयोग करना है जो क्लास ऑब्जेक्ट में पॉइंटर लेता है और फिर उसके किसी भी सदस्य को कॉल कर सकता है। यह वाक्यविन्यास को थोड़ा सा साफ़ करता है लेकिन सबसे बड़ा लाभ (मेरे लिए) यह है कि प्राप्त करने के लिए आपको Boost जैसे कुछ शामिल करने की आवश्यकता नहीं है। लेकिन अगर आप boost::threads का उपयोग कर रहे हैं तो आप boost::bind भी ले सकते हैं। ध्यान दें, सी ++ 11 std::bind ताकि आप pthreads साथ bind इस्तेमाल कर सकते हैं और साथ ही और नहीं इस तरह के बूस्ट के रूप में किसी भी अतिरिक्त निर्भरता की स्थिति है, लेकिन है कि आप का उपयोग करने के सी ++ 11.

मैं एक सम्मोहक वाक्य रचना कारण नहीं दिख रहा से बचने के लिए चाहते हैं, तो है bind का उपयोग करके एक स्थिर विधि है जो सदस्य कार्यों को कॉल करती है। लेकिन यह व्यक्तिगत वरीयता का मामला है।

1

तो, यदि यह मौजूद है तो क्या अंतर है?

मुख्य अंतर यह है कि आपको थ्रेड फ़ंक्शन के भीतर पहुंचने की आवश्यकता क्या है।

अपने डिजाइन की आवश्यकता है कि आप एक वर्ग उदाहरण के डेटा तक पहुंच है, तो एक वर्ग उदाहरण (उपयोग boost::bindthis साथ और एक सदस्य समारोह, या एक void*this को मैप किया साथ एक स्थिर सदस्य समारोह के हिस्से के रूप में अपने धागा लांच - कि एक है ज्यादातर शैली की बात)।

अपने डिजाइन की आवश्यकता है कि धागा समारोह एक विशेष वस्तु के डेटा पर निर्भर नहीं है, तो एक नि: शुल्क समारोह का उपयोग करें।

7

वहाँ कोई अंतर नहीं है - thread contructor आंतरिक bind उपयोग करता है। लोग ऐतिहासिक कारणों से स्पष्ट रूप से bind का उपयोग करते हैं, क्योंकि बूस्ट। थ्रेड में "binding" constructor before 1.36 नहीं था।

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