So, ich hab' das ganze noch schnell auf das andere Schema umgestellt:
void StartNextThread()
{
UINT threadId = 0;
HANDLE thread = reinterpret_cast<HANDLE>(_beginthreadex(0, 0, &ThreadFn, 0, 0, &threadId));
::CloseHandle(thread);
}
unsigned __stdcall ThreadFn(void*)
{
counter--;
::SetEvent(event);
return 0;
}
void Run()
{
::ResetEvent(event);
counter = 1000;
while (counter > 0)
{
StartNextThread();
::WaitForSingleObject(event, INFINITE);
::ResetEvent(event);
}
}
Zeit liegt immer noch bei ~~ 0.13 ms pro Thread.
Selbst wenn ich nicht nur auf den Event, sondern auf das Thread-Object selbst warte, ändert sich nichts an der gemessenen Zeit:
void Run()
{
counter = 1000;
while (counter > 0)
{
::ResetEvent(event);
UINT threadId = 0;
HANDLE thread = reinterpret_cast<HANDLE>(_beginthreadex(0, 0, &ThreadFn, 0, 0, &threadId));
::WaitForSingleObject(event, INFINITE);
::WaitForSingleObject(thread, INFINITE);
::CloseHandle(thread);
}
}
EDIT:
Und nochmal auf nem Athlon 4850e (2 * 2.5 GHz) getestet, Windows 2008 R2 64 Bit, 4 GB RAM: 0.095 ~ 0.11 ms pro Thread.
Es wäre natürlich möglich dass ältere bzw. 32 Bit Windows-Versionen hier schlechter abschneiden. Hab ich aber grad keine da zum testen...
EDIT2:
Core i5 2500T (4 * 2.3 ~ 3.3 GHz), Windows 7 64 Bit, 8 GB RAM: 0.043 ~ 0.049 ms pro Thread.