ho imparato ad amare lambda, e qualche tempo fa ho scritto un semplice involucro che prende un lambda e inizia su un nuovo thread.Tracing punti creazione dei thread per il debug
//
// Starts a task on a separate thread, when passed a lambda expression
//
template<typename T>
smart_ptrs::w32handle StartTask(T f)
{
// Make a copy of the task on the heap
T* pTask = new T(f);
// Create a new thread to service the task
smart_ptrs::w32handle hThread(::CreateThread(
NULL,
0,
(LPTHREAD_START_ROUTINE)& detail::start_task_proc<T>,
(LPVOID) pTask,
NULL,
NULL));
// If the caller ignores this rc, the thread handle will simply close and the
// thread will continue in fire-and-forget fashion.
return hThread;
}
NOTA: Sì, lo so questo non ha veramente bisogno di un modello e potrebbe tranquillamente usare std::function
. L'ho postato in questo modo perché corrisponde a versioni più complicate (coda asincrona) che ho bisogno di essere template.
Il risultato finale è una funzione che è molto facile da utilizzare algoritmi paralleli ecc Tuttavia si verifica un problema se si inizia ad utilizzare tale funzione estesamente. Poiché i thread creati sembrano provenire dalla stessa funzione piuttosto generica, può diventare difficile stabilire dove sono stati avviati nel codice. Di solito è possibile elaborare il contesto di ciò che stanno facendo, ma non è così semplice come in passato quando si utilizza una funzione di thread esplicita. Qualcuno ha un buon metodo per etichettare tali thread in modo che siano più facili da eseguire il debug?
Se si utilizza lambda, ti sembra di avere il supporto C++ 11. Ma se lo hai, perché dovresti usare quella roba roba su WinAPI invece di 'std :: thread' di C++ 11? –
Non risponde alla domanda in sé, ma conosci ['std :: async'] (http://en.cppreference.com/w/cpp/thread/async)? – Angew
OT: Usare la deduzione argomento template su std :: function è più flessibile in tutto e potenzialmente più efficiente (non applicabile qui, scommetto). – sehe