2015-06-23 7 views
8

मैं अपने सी ++ एप्लिकेशन पर धागे का उपयोग करने की कोशिश कर रहा हूं।संकलन सी ++ धागे

मेरे कोड है:

In file included from /opt/centos/devtoolset-1.0/root/usr/lib/gcc/x86_64-redhat-linux/4.7.0/../../../../include/c++/4.7.0/bits/move.h:57:0, 
       from /opt/centos/devtoolset-1.0/root/usr/lib/gcc/x86_64-redhat-linux/4.7.0/../../../../include/c++/4.7.0/bits/stl_pair.h:61, 
       from /opt/centos/devtoolset-1.0/root/usr/lib/gcc/x86_64-redhat-linux/4.7.0/../../../../include/c++/4.7.0/bits/stl_algobase.h:65, 
       from /opt/centos/devtoolset-1.0/root/usr/lib/gcc/x86_64-redhat-linux/4.7.0/../../../../include/c++/4.7.0/bits/char_traits.h:41, 
       from /opt/centos/devtoolset-1.0/root/usr/lib/gcc/x86_64-redhat-linux/4.7.0/../../../../include/c++/4.7.0/ios:41, 
       from /opt/centos/devtoolset-1.0/root/usr/lib/gcc/x86_64-redhat-linux/4.7.0/../../../../include/c++/4.7.0/ostream:40, 
       from /opt/centos/devtoolset-1.0/root/usr/lib/gcc/x86_64-redhat-linux/4.7.0/../../../../include/c++/4.7.0/iostream:40, 
       from C.cpp:1: 
/opt/centos/devtoolset-1.0/root/usr/lib/gcc/x86_64-redhat-linux/4.7.0/../../../../include/c++/4.7.0/type_traits: In instantiation of 'struct std::_Result_of_impl<false, false, std::_Mem_fn<void* (C::*)(void*)const>, C*>': 
/opt/centos/devtoolset-1.0/root/usr/lib/gcc/x86_64-redhat-linux/4.7.0/../../../../include/c++/4.7.0/type_traits:1857:12: required from 'class std::result_of<std::_Mem_fn<void* (C::*)(void*)const>(C*)>' 

और एक बहुत अधिक ...

मैं के साथ संकलन कर रहा हूँ:

#include <iostream> 
#include <thread> 

class C 
{ 
public: 

    void * code(void * param) 
    { 
     std::cout << "Code thread executing " << std::endl; 
     return NULL; 
    } 
}; 

int main() 
{ 
    C c; 
    std::thread t (&C::code, &c); 
    t.join(); 
} 

जब संकलन, मैं उन त्रुटियों को मिल गया

g++ -std=c++0x C.cpp 

कंपाइलर संस्करण:

$g++ --version 
g++ (GCC) 4.7.0 20120507 (Red Hat 4.7.0-5) 

मैं क्या गलत कर रहा हूं?

+1

जब आप थ्रेड – Niall

+1

बीटीडब्ल्यू बनाते हैं, तो आप फ़ंक्शन कोड के लिए उपयोग करने के लिए पैरामीटर खो रहे हैं, यह एक उत्कृष्ट पहला प्रश्न है। स्पष्ट, पुनरुत्पादित उदाहरण। पूर्ण संकलक विवरण भी। बहुत बढ़िया। – Barry

उत्तर

8

std::thread पॉज़िक्स थ्रेड के समान नहीं है, इसे void* तर्क लेने और void* वापस करने की आवश्यकता नहीं है। thread कन्स्ट्रक्टर जब तक आप सही तर्क निर्दिष्ट करते हैं तब तक कोई कॉल करने योग्य हो सकता है।

इस मामले में विशिष्ट त्रुटि है कि आप प्रभावी रूप से कहता है कि c.code() (तकनीकी रूप से INVOKE(&C::code, &c)) एक धागा शुरू करने के लिए प्रयास कर रहे हैं, लेकिन यह गलत कॉल के बाद से C::code एक तर्क लेता है और आप शून्य से कॉल करने की कोशिश कर रहे है। सीधे शब्दों में मैच के लिए क्या आप इसके साथ बुला रहे हैं code() पर हस्ताक्षर ठीक:,

std::thread t (&C::code, &c, nullptr); 
           ^^^^^^^ 

किसी भी तरह से सुनिश्चित करें कि आप के साथ संकलन करते हैं:

void code() 
{ 
    std::cout << "Code thread executing " << std::endl; 
} 

वैकल्पिक रूप से, आप thread निर्माता को void* आर्ग प्रदान कर सकते हैं -pthread

+0

धन्यवाद। यह अच्छी तरह से काम किया !! –

3

अपनी कक्षा सी एक प्रतिदेय वस्तु ऑपरेटर()

#include <iostream> 
#include <thread> 

class C 
{ 
public: 

    void operator()(void) 
    { 
       std::cout << "Code thread executing " << std::endl; 

     return NULL; 
    } 
}; 

int main() 
{ 
    C c; 
    std::thread t (c); 
    t.join(); 
} 

का उपयोग करके या एक प्रतिदेय वस्तु

#include <iostream> 
#include <thread> 
#include <functional> 

class C 
{ 
public: 

    void * code(void) 
    { 
       std::cout << "Code thread executing " << std::endl; 

     return NULL; 
    } 
}; 

int main() 
{ 
    C c; 
    std::thread t (std::bind(&C::code, &c)); 
    t.join(); 
} 

में आप वर्ग बारी और --std को = C++ 11

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