[C++] Multithreading Windows & Linux

[Moepi]1

Lt. Commander
Registriert
Jan. 2002
Beiträge
1.233
Hallo Leute,
einen ähnlichen Thread hatte ich vor kurzem im Linuxforum. Das Ergebnis daraus war, dass unter Linux eine Anwendung offensichtlich nur dann von mehreren (Worker)Threads profitiert, wenn diese Threads mind. 100-200ms exisitieren und arbeiten, da andernfalls der Loadbalancer des Linuxkernels (kernel/sched.c) keine Chance hat, die Threads auf mehrere Prozessoren zu verteilen. Windows macht das etwas schneller...

Jetzt hatte ich die Idee, für mein kleines FFT Benchmark die Threads beim Instanziieren des Benchmarkalgorithmus erstellen und starten zu lassen. Damit sie nicht unkontrolliert laufen, hatte ich eine Idle-Loop geplant. Da drinnen sollen die Threads warten, bis sie von außen via Signal aufgeweckt werden. Dadurch existieren die Threads während des gesamten Benchmarks und nicht nur während eines FFT-Durchlaufs, was es auch Linux ermöglichen wird, die Threads schnell genug auf 2 oder mehr CPUs zu verteilen. In Code hatte ich mir das wie folgt vorgestellt:

Code:
FftItAsmMulti::FftItAsmMulti()  // Konstruktor
{
  ...
  pthread_t threads[2];
	
  pthread_create(&threads[0],NULL,FftItAsmMulti::idleLoop,NULL);
  pthread_create(&threads[1],NULL,FftItAsmMulti::idleLoop,NULL);

  startThread(threads[0]);
  startThread(threads[1]);
  waitForThreads(); (<- Problem: pthread_join wird nicht klappen!)
}

FftItAsmMulti::idleLoop()
{
  while(true)
  {
    thread.sleep();
    FftItAsmMulti::fftKernel();
  }
}

FftItAsmMulti::fftKernel()
{
  ...
}

Das ganze soll also so laufen, dass die Threads sofort im Konstruktor in ne idleLoop geschickt werden, wo sie einfach nur schlafend warten sollen. Sobald dann der Kernel zur Ausführung kommen soll, müsste ihnen ein Signal geschickt werden. Die Threads laufen in die Kernelschleife, machen die Arbeit und kehren danach wieder in die IdleLoop zurück.
Dabei habe ich 2 Probleme:

1) Wie schaffe ich es unter Linux mit der pthread.h Threads einfach schlafen zu schicken? ein pthread_sleep gibts ja leider nicht... :(

2) Wie erreiche ich, dass der Hauptthread (also das Programm selbst), nach dem Aufwecken der Threads wieder wartet, bis die Threads fertig sind und wieder schlafen? Ich müsste also den Hauptthread schlafen schicken, sobald die Worker arbeiten und ihn dann von den Workern wieder aufwecken lassen, wenn die beiden fertig sind.
Ein Join wird hier nicht gehen, da die Workerthreads ja nicht terminieren (sollen).


Danke für Eure Vorschläge!



/Edit:
Es gibt ein PThread::Suspend und ein PThread::Resume. Das ist schon mal ein Hoffnungsschimmer für Problem (1). Problem daran ist, dass diese Mehtoden in der pthread.h offensichtlich nicht ausformuliert sind und von mir reimplementiert werden müssen. Leider hab ich keinen Plan, wie ich nen Thread resorucenschonend davon abhalten kann, Code auszuführen...
 
Zuletzt bearbeitet:
Hast du dir condition variables angeschaut? die sollten genau machen was du willst.
 
Unter Windows wäre eine Möglichkeit WaitForSingleObject(). Das gibt es aber unter Linux natürlich nicht.

MfG

Arnd
 
Zurück
Oben