Sto imparando sul multithreading in C++ e sto cercando di impostare un pool di thread, ma sto ricevendo un errore di compilatore che dice "errore: 'mapperNodes' non viene catturato" e "errore: 'comando' non viene catturato". Ho letto un po 'sull'utilizzo di "this" per catturare le variabili nel lambda, ma finora nulla ha funzionato.Errore compilatore variabile "Non catturato" all'interno della funzione lambda per threadpool
Come posso utilizzare le variabili command e mapperNoders nella funzione lambda del pool di thread nel codice seguente?
void MapReduceServer::spawnMappers() throw() {
vector<string> mapperNodes(nodes);
random_shuffle(mapperNodes.begin(), mapperNodes.end());
string command = buildCommand(mapperNodes[0], executablePath, mapperExecutable, mapOutputPath);
ThreadPool pool(numMappers);//numMappers = 8
for (size_t id = 0; id < numMappers; id++) {
pool.schedule([id] {
cout << oslock << "Thread (ID: " << id << ") has started." << endl << osunlock;
spawnWorker(mapperNodes[0], command); /*compiler error here*/
cout << oslock << "Thread (ID: " << id << ") has finished." << endl << osunlock;
});
}
@ M.M, penso che ti sbagli. §11.4.4 di TC++ PL 4th ed. dice esplicitamente che un elenco di argomenti vuoto può essere omesso. Così fa, per esempio, [questo articolo in cppreference.com] (http://en.cppreference.com/w/cpp/language/lambda). – Paulo1205
@ Paulo1205 bello, buono a sapersi –