Pausieren von Threads / Hauptprozesses
-
Hallo zusammen
Momentan bin ich drann mit pthreads unter linux zu arbeiten.
Dabei werden die Threads sozusagen als "Arbeiter" genutzt.Der Hauptprozess übergibt den Threads n Objekt mit nem pointer auf nen vector<string> in dem der zu bearbeitenden Inhalt steht, ein pointer
vector<string> mit der id des threads, der den eintrag bearbeiten soll und dann noch die id des threads. Zudem noch paar andre Werte die jetz nur Zweitrangig sind.Der Hauptprozess selbst befüllt danach nur noch die Elemente und sagt welcher Thread sich kümmern soll. Sind alle Fächer belegt (Vorgabe max. 20 Fächer hab ich mir gesagt), soll ne Pause gemacht werde.
Ähnlich sollen dann die Threads arbeiten. Sollen prüfen, ob ein Fach für Sie bereitsteht, wenn ja dann soll der Thread was machen, wenn nein soll er den Prozessor nicht unnötig belasten und soll ne Pause machen.
Hier die Frage:
sleep mud usleep (?) arbeiten ja threadabhängig (sleep wirkt sich nur auf den aktuellen Thread aus. Doch wenn ich Sleep im Hauptprozess nutze, werden da die andren Threads mit schlafen gelegt?Hab nämlich testhalber 'n Programm gemachd und dabei gab es das Problem, dass die Testausgabe anders ausgschaut hat als ich erhofft habe.
Ich habe dabei ein Thread erstellt welches eine Schleife ausführt in dem insg. 5 mal Pause (sleep(1)) gemacht wird und danach eine Ausgabe. Das Gleiche sollte auch im Hauptprozessor passieren nur mit sleep(2), damit der Hauptprozess länger dauert .Nochmal insgesammt der grund für den Thread:
Wirkt sich sleep dann nur auf Hauptprozess aus oder auch auf die Threads? Oder hab ich einfach n Fehler gemacht bei meinem Testprogramm?Danke im voraus
-
Hallo
Soweit ich die Anforderung verstanden habe wäre es gut mit conditional variablen und mutexen zu lösen. Die Workerthreads legen sich mit pthread_cond_wait so lange schlafen bis der main-thread eine neue Aufgabe bereit hat und dies mit pthread_cond_signal oder pthread_cond_broadcast den Threads mitteilt. Durch den Mutex ist auch der "Auftragsverteiler" gegen gleichzeitige Zugriffe geschützt. Mit sleep kann man nur nach dem Aufwachen permanent nachfragen ob eine Aufgabe da ist oder nicht ... das funktioniert zwar, ist aber IMHO nur in wenige Fällen effizient (außer man benutzt vielleicht spin-locks und atomic flags für ein besonders schnelles und kurze Operationen)
Zur eigentlichen Frage kann ich nur sagen, dass laut doku ein Aufruf von sleep und usleep nur den aktuellen Thread, nicht aber den ganze Prozess beeinflusst. Ich habe bei einer Portierung eines Windows-Programms auf Linux auch immer usleep als "Übersetzung" von "Sleep()" benutzt und das Programmergebnis war - so weit ich es prüfen konnte - identisch -> Andere Threads werden von sleep/usleep nicht beeinflusst.
lg XOR