2015-12-05 8 views
5

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; 
    }); 
} 
+0

@ 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

+0

@ Paulo1205 bello, buono a sapersi –

risposta

5

Quando hai scritto pool.schedule([id]{ /*...*/ });, ti ha detto il compilatore che il lambda vuole solo una copia del il valore della variabile id, e nient'altro.

Per eseguire (una copia di) tutte le variabili di MapReduceServer::spawnMappers() a disposizione del lambda, è possibile modificare [id] per [=].

+1

Detto questo, probabilmente non si desidera una * copia * di tutte le variabili disponibili. –

+0

Manderei qualcosa come [mapperNodes, comando]? – user3316012

+0

@JoelCornett, d'accordo, la variabile 'pool' potrebbe essere omessa. Forse dovrebbe usare '[id, command, mapperNodes]'. – Paulo1205