2015-06-23 16 views
8

Sto provando a utilizzare i thread sull'applicazione C++.Compilazione di thread C++

Il mio codice è:

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

Quando si compila, ho avuto questi errori:

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

e molto di più ...

Sto compilando con:

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

Versione del compilatore:

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

Cosa sto facendo male?

+1

Manca un parametro da utilizzare per il codice funzione quando si crea il thread – Niall

+1

Btw, questa è un'ottima prima domanda. Esempio chiaro e riproducibile. Anche i dettagli completi del compilatore. Molto bene. – Barry

risposta

8

std::thread non è la stessa cosa del thread POSIX, non deve prendere un argomento void* e restituire un void*. Il costruttore thread può accettare qualsiasi chiamabile purché si specificano gli argomenti giusti.

L'errore specifico, in questo caso è che si sta tentando di avviare un thread che chiama efficacemente c.code() (tecnicamente INVOKE(&C::code, &c)), ma che è una chiamata non valida dal C::code prende un argomento e si sta tentando di chiamare con lo zero. È sufficiente fissare la firma sul code() per corrispondere a ciò che si sta chiamando con:

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

In alternativa, è possibile fornire il void* arg al costruttore thread:

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

In entrambi i casi, assicurarsi che si compila con -pthread.

+0

Grazie. Ha funzionato bene !! –

3

Fai la tua classe C un oggetto richiamabile tramite operatore()

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

o trasformarti classe in un oggetto invocabile

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

e passare alla --std = C++ 11