Frage

Ich bin Codierung die Abschaltung eines multithreaded server.If Verläuft alles wie es sollte alle Fäden Ausgang von ihrer eigenen, aber es gibt eine kleine Chance, dass ein Thread bekommt stuck.In diesen Fall ist es zweckmäßig wäre, eine nicht zu haben blockier beitreten, so könnte ich tun.

Gibt es eine Möglichkeit, einen nicht-blockierende pthread_join zu tun? Irgendeine Art von zeitlich abgestimmten beitreten würde zu gut sein.

so etwas wie folgt aus:

foreach thread do
  nb_pthread_join();
    if still running
      pthread_cancel();

kann ich mehr Fälle denken, wo ein ein nicht-bloking wäre nützlich verbinden.

Wie es scheint, gibt es keine solche Funktion, so habe ich bereits eine Abhilfe codiert, aber es ist nicht so einfach, wie ich möchte.

War es hilfreich?

Lösung

Wie andere haben darauf hingewiesen, gibt es keine nicht-blockierende pthread_join in den Standard Pthread Bibliotheken.

Allerdings ist Ihr erklärtes Problem gegeben (versuchen zu garantieren, dass alle Threads auf Programmabschaltung verlassen haben) eine solche Funktion nicht benötigt wird. Sie können dies einfach tun:

int killed_threads = 0;
for(i = 0; i < num_threads; i++) {
   int return = pthread_cancel(threads[i]);
   if(return != ESRCH)
      killed_threads++;
}
if(killed_threads)
    printf("%d threads did not shutdown properly\n", killed_threads)
else
    printf("All threads exited successfully");

Es ist nichts falsch mit pthread_cancel Aufruf an alle Threads (beendet oder nicht), so fordern, dass nicht für alle Threads blockieren und garantieren Fadenausgang (sauber oder nicht).

Das sollte als eine 'einfache' Abhilfe qualifizieren.

Andere Tipps

Wenn Sie Ihre Anwendung auf Linux laufen, können Sie interessiert sein, das zu wissen:

int pthread_tryjoin_np(pthread_t thread, void **retval);

int pthread_timedjoin_np(pthread_t thread, void **retval,
                                const struct timespec *abstime);

Seien Sie vorsichtig, da das Suffix es schon sagt, „np“ bedeutet „nicht tragbar“. Sie sind nicht POSIX-Standard, Gnu-Erweiterungen, nützlich aber.

Link zu Manpage

Der ‚pthread_join‘ -Mechanismus ist ein Bequemlichkeitsgründen verwendet werden, wenn es genau das zu tun, geschieht, was Sie wollen. Es tut nichts, Sie nicht selbst tun könnte, und wo es nicht genau das, was Sie wollen, Code genau das, was Sie wollen.

Es gibt keinen wirklichen Grund, warum Sie eigentlich egal ist, ob ein Thread beendet ist oder nicht. Was Sie interessiert, ist, ob die Arbeit der Faden tat abgeschlossen ist. Zu sagen, dass, haben den Faden etwas tun, um anzuzeigen, dass es funktioniert. Wie Sie das tun, hängt davon ab, was für Ihr spezielles Problem ist ideal, die auf stark abhängt, was die Fäden tun.

Beginnen Sie mit Ihrem Denken zu ändern. Es ist nicht ein Thread, der stecken bleibt, ist es, was der Faden das tat stecken bleibt.

Wenn Sie für QNX sind entwickeln, können Sie pthread_timedjoin () Funktion verwenden.

Sie können einen separaten Thread erstellen, die pthread_join durchführen wird () und den übergeordneten Thread aufmerksam machen, durch eine Semaphore beispielsweise signalisiert, dass das Kind Thread abgeschlossen ist. Dieser separate Thread zurückgeben kann, was von pthread_join bekommt ist () bestimmt das Muttergewinde zu lassen, nicht nur, wenn das Kind abgeschlossen ist, sondern auch, welcher Wert er zurückkehrt.

Die Antwort hängt wirklich davon ab, warum Sie dies tun wollen. Wenn Sie nur tote Threads bereinigen möchten, zum Beispiel, ist es wahrscheinlich zu haben, am einfachsten nur einen „toten Fadenreiniger“ Thread, Schleifen und schließt sich.

Ich bin mir nicht sicher, was genau du meinst, aber ich gehe davon aus, dass Sie wirklich, was Sie brauchen ist eine Wartezeit und benachrichtigen Mechanismus.

Kurz gesagt, hier ist, wie es funktioniert: Sie warten auf eine Bedingung mit einem Timeout zu befriedigen. Ihr Warten wird zu Ende sein, wenn:

  • Die Timeout auftritt, oder
  • Wenn die Bedingung erfüllt ist.

Sie können in einer Schleife haben dies und noch mehr Intelligenz in Ihrer Logik hinzuzufügen. Die beste Ressource, die ich für diese Pthreads Zusammenhang gefunden haben, ist dieses Tutorial: POSIX Threads Programmierung ( https://computing.llnl.gov/tutorials/pthreads/ ) .

Ich bin auch sehr überrascht zu sehen, dass es keine API für Minuten- beitreten in Pthreads.

Es gibt keinen zeitlichen pthread_join, aber wenn Sie für anderen Thread auf Bedingungen blockiert warten, können Sie zeitlich pthread_cond_timed_wait anstelle von pthread_cond_wait

Sie könnten ein Byte in ein Rohr schieben geöffnet, wie non-blocking auf den anderen Thread zu signalisieren, wenn ihre getan, dann verwenden Sie ein nicht-blockierenden Schreib- den Status der Leitung zu überprüfen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top