2015-06-23 14 views
8

Próbuję użyć wątków w mojej aplikacji C++.Kompilowanie wątków C++

Mój kod to:

#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(); 
} 

Podczas kompilacji, dostałem te błędy:

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*)>' 

i wiele więcej ...

Mam kompilacji z:

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

Wersja kompilatora:

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

Co robię źle?

+1

Brakuje parametru, który będzie użyty dla kodu funkcji podczas tworzenia wątku – Niall

+1

Btw, jest to doskonałe pierwsze pytanie. Jasny, powtarzalny przykład. Pełne szczegóły kompilatora. Dobra robota. – Barry

Odpowiedz

8

std::thread to nie to samo co wątek POSIX, nie musi przyjmować argumentu void* i zwracać wartości void*. Konstruktor thread może pobierać dowolne parametry, o ile podasz właściwe argumenty.

Specyficzny błąd w tym przypadku jest to, że próbujesz uruchomić wątku, która skutecznie wywołuje c.code() (technicznie INVOKE(&C::code, &c)), ale to jest nieważne wezwanie od C::code przyjmuje jeden argument i próbuje nazwać zera. Wystarczy ustalić podpis na code() pasujące do czego wzywają go:

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

Alternatywnie, można dostarczyć void* argumentu do konstruktora thread:

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

czy inaczej, upewnij się skompilować -pthread.

+0

Dzięki. To działało ładnie !! –

3

Dodać klasa C wywoływalnym obiekt za pomocą operatora()

#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(); 
} 

lub włączyć się do klasy na żądanie obiektu

#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(); 
} 

i przełączyć się --std = C++ 11