#include <thread>
#include <iostream>
class bar {
public:
void foo() {
std::cout << "hello from member function" << std::endl;
}
};
int main()
{
std::thread t(&bar::foo, bar());
t.join();
}
संपादित करें: अपने संपादन का लेखा-जोखा, आपको इसे इस तरह करना होगा:
std::thread spawn() {
return std::thread(&blub::test, this);
}
अद्यतन: मैं कुछ और बिंदुओं की व्याख्या करना चाहता हूं, उनमें से कुछ पर टिप्पणियों में भी चर्चा की गई है।
ऊपर वर्णित सिंटैक्स को INVOKE परिभाषा (.220.8.2.1) के संदर्भ में परिभाषित किया गया है:
निम्न के अनुसार INVOKE (f, t1, t2, ..., tN) को परिभाषित करें:
- (t1। * f) (t2, ..., tN) जब f एक वर्ग T के सदस्य फ़ंक्शन का सूचक है और t1 टाइप T का एक ऑब्जेक्ट है या टाइप T के ऑब्जेक्ट का संदर्भ या a का संदर्भ है टी से प्राप्त एक प्रकार की वस्तु;
- ((* t1)। * f) (t2, ..., tN) जब f एक वर्ग T के सदस्य फ़ंक्शन के लिए एक सूचक है और t1 पिछले आइटम में वर्णित प्रकारों में से एक नहीं है;
- t1। * f जब N == 1 और f एक वर्ग T के सदस्य डेटा के लिए एक सूचक है T और t 1 टाइप T
का एक ऑब्जेक्ट है या टाइप T के ऑब्जेक्ट का संदर्भ या किसी ऑब्जेक्ट के ऑब्जेक्ट का संदर्भ है
व्युत्पन्न प्रकार के । टी;
- (* t1)। * f जब N == 1 और f एक वर्ग T के सदस्य डेटा का सूचक है और t 1, पिछले आइटम में वर्णित प्रकारों में से एक नहीं है;
- f (t1, t2, ..., tN) अन्य सभी मामलों में।
एक और सामान्य तथ्य जो मैं इंगित करना चाहता हूं वह यह है कि डिफ़ॉल्ट रूप से थ्रेड कंस्ट्रक्टर इसे पारित किए गए सभी तर्कों की नकल करेगा। इसका कारण यह है कि तर्कों को कॉलिंग थ्रेड को रेखांकित करने की आवश्यकता हो सकती है, तर्कों की नकल करना गारंटी देता है कि। इसके बजाय, यदि आप वास्तव में एक संदर्भ पास करना चाहते हैं, तो आप एक std::reference_wrapper
बनाया द्वारा उपयोग कर सकते हैं std::ref
।
std::thread (foo, std::ref(arg1));
ऐसा करने से, आप वादा कर रहे हैं कि आप इस बात की गारंटी लेंगे कि जब धागा उन पर काम करेगा तब भी तर्क मौजूद रहेंगे।
ध्यान दें कि ऊपर बताई गई सभी चीज़ों पर भी लागू किया जा सकता है std::async
और std::bind
।