Frage Linux pthread_suspend


Sieht so aus, als ob Linux pthread_suspend nicht implementiert und fortfährt, aber ich brauche wirklich em.

Ich habe cond_wait versucht, aber es ist zu langsam. Die Arbeit, die eingefädelt wird, wird meistens in 50us ausgeführt, führt aber gelegentlich über 500ms aus. Das Problem mit cond_wait ist zweifach. Die Mutex-Verriegelung ist vergleichbar mit den Mikro-Sekunden-Ausführungen und ich brauche keine Verriegelung. Zweitens habe ich viele Worker-Threads, und ich möchte nicht wirklich N-Bedingung-Variablen machen, wenn sie geweckt werden müssen.

Ich weiß genau, welcher Thread auf welche Arbeit wartet und könnte den Thread nur pthread_continue. Ein Thread weiß wann es keine Arbeit mehr gibt und kann sich leicht pthread_suspendieren. Dies würde keine Verriegelung verwenden, den Ansturm vermeiden und schneller sein. Problem ist .... nein pthread_suspend oder _continue.

Irgendwelche Ideen?


9
2018-06-08 01:18


Ursprung


Antworten:


Lassen Sie den Thread auf ein bestimmtes Signal warten.

Benutzen pthread_sigmask und sigwait.


7
2018-06-08 01:33



Lassen Sie die Threads auf einem Rohr lesen. Dann versenden Sie die Daten durch die Pipe. Die Threads werden als Ergebnis der Ankunft der Daten, die sie verarbeiten müssen, aufwachen. Wenn die Daten sehr groß sind, senden Sie einfach einen Zeiger durch die Pipe.

Wenn bestimmte Daten zu bestimmten Threads gehen müssen, benötigen Sie eine Pipe pro Thread. Wenn ein Thread irgendwelche Daten verarbeiten kann, dann können alle Threads auf derselben Pipe blockieren und sie werden Round-Robin auslösen.


2
2018-06-08 02:50



Es scheint mir, dass eine solche Lösung (das heißt, "pthread_suspend" und "pthread_continue" verwenden) ist zwangsläufig rassig.

Zwischen der Endbearbeitung des Worker-Threads und der Entscheidung, sich selbst zu suspendieren, kann ein willkürlicher Zeitraum verstreichen, und das Aussetzen findet tatsächlich statt. Wenn der Haupt-Thread während dieser Zeit entscheidet, dass dieser Worker-Thread wieder funktionieren soll, hat der "Fortfahren" keine Wirkung und der Worker-Thread wird sich selbst aussetzen.

(Beachten Sie, dass dies nicht für Suspendierungsmethoden gilt, mit denen das "Fortfahren" in die Warteschlange gestellt werden kann, wie z sigwait() und read() Methoden, die in anderen Antworten erwähnt werden).


0
2018-06-08 02:49



Möglicherweise versuchen Sie eine Option von pthread_cancel, aber seien Sie vorsichtig, wenn irgendwelche Sperren freigegeben werden, lesen Sie die man-Seite, um den Abbruchzustand zu identifizieren


0
2018-06-11 17:24



Warum interessiert es dich, welcher Thread die Arbeit macht? Es hört sich so an, als hättest du dich in eine Ecke hineingestaltet und jetzt brauchst du einen Trick, um dich rauszuholen. Wenn Sie zulassen, dass der Thread, der bereits ausgeführt wurde, die Arbeit ausführt, würden Sie diesen Trick nicht benötigen, und Sie würden auch weniger Kontextwechsel benötigen.


0
2017-09-15 10:01