Ich bin gekommen, Lambda-Ausdrücke zu lieben, und vor einer Weile habe ich eine einfache Hülle, die eine Lambda nimmt und beginnt es auf einem neuen Thread.Tracing Thread-Erzeugung Punkte für das Debuggen
//
// 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;
}
HINWEIS: Ja, ich weiß, das muss nicht wirklich eine Vorlage und glücklich std::function
nutzen könnten. Ich habe es auf diese Weise gepostet, weil es mit komplizierteren (asynchronen) Versionen übereinstimmt, die ich habe, die Vorlagen sein müssen.
Das Endergebnis ist eine Funktion, die sehr einfach ist, usw. in parallelen Algorithmen verwenden jedoch ein Problem entsteht, wenn Sie umfassend eine solche Funktion zu nutzen beginnen. Da die erzeugten Threads scheinbar alle von der gleichen generischen Funktion stammen, kann es schwierig werden zu sagen, wo im Code sie gestartet wurden. Es ist normalerweise möglich, aus dem Kontext dessen, was sie tun, heraus zu arbeiten, aber es ist nicht so einfach wie früher, wenn eine explizite Thread-Funktion verwendet wird. Hat jemand eine gute Methode, solche Threads zu markieren, damit sie einfacher zu debuggen sind?
Wenn Sie lambdas verwenden, scheinen Sie C++ 11-Unterstützung zu haben. Aber wenn du das hättest, warum würdest du dieses ungeschickte WinAPI-Thread-Zeug anstelle von C++ 11s "std :: thread" verwenden? –
Beantworten Sie die Frage nicht selbst, aber kennen Sie ['std :: async'] (http://en.cppreference.com/w/cpp/thread/async)? – Angew
OT: Die Verwendung der Template-Argumentableitung über die std :: -Funktion ist insgesamt flexibler und potenziell effizienter (hier nicht anwendbar, wette ich). – sehe