passando Lambda a pthread_create?

Ricerco tutta la rete per la risposta, ma non ho trovato alcuna soluzione. Puoi per favore aiutare. Il mio problema è che sto cercando di inviare Lambda a un’altra funzione e utilizzare la libreria Pthread per eseguire il lambda su più thread. Il prossimo è il codice:

  1 #include  2 #include  3 #include  4 #include  5 6 using namespace std; 7 8 9 template 10 inline Function parallel_fun(InputIt first, InputIt last, Function f) 11 { 12 pthread_t threads[4]; 13 14 for (int i=0; first != last; ++first) { 15 16 pthread_create(&threads[i], nullptr,f , nullptr); 17 18 i++; 19 } 20 21 for (int i=0; i<4;i++) { 22 23 pthread_join(threads[i],nullptr); 24 25 26 } 27 28 29 30 31 return f; 32 } 33 34 35 int main() 36 { 37 int z=90; 38 vector a(4); 39 a[0]=1; a[1]=2; 40 parallel_fun(a.begin(), a.end(), [=](void* data) -> void* 41 { 42 cout<<"test"<<z<<endl; 43 //do something 44 }); 45 46 47 48 return 0; 49 } 

g++ -std=c++0x -pthread test.cpp -oa usando la seguente riga: g++ -std=c++0x -pthread test.cpp -oa

e ricevo questo errore:

 test.cpp: In function 'Function parallel_fun(InputIt, InputIt, Function) [with InputIt = __gnu_cxx::__normal_iterator<int*, std::vector >, Function = main()::]': test.cpp:44:11: instantiated from here test.cpp:16:10: error: cannot convert 'main()::' to 'void* (*)(void*)' for argument '3' to 'int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)' 

Non sono sicuro della nuova API C ++ 11. Non penso di avere abbastanza tempo per imparare nuove API.

Questo è il tuo giorno fortunato. L’API C ++ 11 è stata fortemente influenzata dai pthread. C’è quasi una traduzione meccanica. Ecco il cast del codice in C ++ 11:

 #include  #include  #include  #include  template inline Function parallel_fun(InputIt first, InputIt last, Function f) { std::thread threads[4]; for (int i=0; first != last; ++first) { threads[i] = std::thread(f); i++; } for (int i=0; i<4;i++) { threads[i].join(); } return f; } int main() { int z=90; std::vector a(4); a[0]=1; a[1]=2; parallel_fun(a.begin(), a.end(), [=]() { std::cout<<"test" << z << std::endl; //do something }); } 

La tua alternativa è capire come std::thread venga implementato su pthreads, che si fida di me, è molto più complicato della traduzione di C ++ 11 mostrata sopra.

Non c’è conversione da lambda a puntatore a funzione a meno che lambda non abbia catture. (§5.1.2p6). Quindi se richiedi la cattura di z , sei sfortunato.

L’interfaccia C si aspetta che tu usi l’argomento void* per le tue chiusure. Potresti farlo, che sarebbe brutto (ma simile a C), oppure potresti usare la nuova libreria di supporto del thread C ++ 11, se il tuo ambiente C ++ lo supporta.