Ich habe ein Problem zu entscheiden, was in dieser Situation zu tun ist, möchte ich einen abgetrennten Thread haben, aber immer noch in der Lage sein, für den Fall, dass ich es vorzeitig abbrechen möchte , vermutlich bevor ich eine neue Instanz davon starte, um sicherzustellen, dass der Thread immer noch nicht auf Dinge zugreift, wenn dies nicht der Fall ist.Einen Thread beenden, der verbunden oder dereferenziert werden könnte
Dies bedeutet, dass ich es nach dem Aufruf den Faden rechts nicht lösen sollte, so ist, dann habe ich ein paar Optionen:
- Selbst lösen den Faden, wenn er das Ende seiner Ausführung ist erreicht, aber dann wouldn‘ t dies verursacht Probleme, wenn ich versuche, es aus dem Hauptthread zu verbinden? Dies wäre meine bevorzugte Lösung, wenn das Problem, es zu verbinden, nachdem es sich selbst gelöst hat, gelöst werden könnte. Ich könnte den Thread-Handle, auf den der Haupt-Thread Zugriff hat, von dem selbst ablösenden Thread dereferenzieren, bevor ich ihn selbst loslöse. Wenn der Haupt-Thread jedoch versucht, direkt vor der Dereferenzierung des Handle-Threads beizutreten, kann dies zu Problemen führen , also müsste ich die Dereferenzierung im Thread schützen und wie auch immer (ich weiß nicht wie, muss ich vielleicht eine Variable erstellen, um dies anzuzeigen) Ich würde prüfen, ob ich dem Hauptthread mit einem Mutex beitreten soll, der kompliziert die Dinge. Irgendwie habe ich das Gefühl, dass dies nicht der richtige Weg ist.
- Lass den Faden hängen, bis ich ihn schließe, was lange dauern kann, je nachdem, wie ich Dinge organisiere, könnte es nicht sein, bevor ich loslasse, was er gemacht hat (zB den Faden vor dem Freigeben eines Bildes verbinden) das wurde vom Thread geladen/verarbeitet, wenn ich es nicht mehr brauche)
- Lassen Sie die Hauptthread regelmäßig abfragen, wenn der Thread seine Arbeit erledigt hat, dann treten Sie ihm bei (oder trennen Sie es tatsächlich) und geben Sie an, es nicht zu versuchen wieder beitreten?
- Oder sollte ich nur
pthread_exit()
aus dem Thread anrufen, aber was ist, wenn ich versuche, es zu verbinden?
Wenn ich ein bisschen verwirrt bin, ist es, weil ich bin. Ich schreibe in C99 mit TinyCThread, einem einfachen Wrapper für Pthread und Win32-API-Threading. Ich bin nicht einmal sicher, wie meine Thread-Handles dereferenziert werden, unter Windows ist der Thread-Handle HANDLE
, und das Festlegen eines Handle auf NULL scheint es zu tun, ich bin mir nicht sicher, ob es der richtige Weg ist, es mit dem pthread_t
-Typ zu machen.
Epilog: Basierend auf John Bollinger ‚s Antwort, die ich mit Abnehmen des Thread gehen wählte, die meisten von diesem Thread des Codes in einem Mutex setzen, auf diese Weise, wenn ein anderer Thread, bis der Faden blockieren will praktisch es getan wird, kann benutze diesen Mutex.
Sie haben Recht. Also ich möchte in der Lage sein, einen Thread abzubrechen und darauf zu warten, dass es vorbei ist, bevor ich fortfahre, ein Mutex ist eine gute Idee. Die Art und Weise, wie ich es aktuell mache, ist, dass ich einen Zeiger auf eine Struktur an meinen Thread weitergebe, der unter anderem ein 'volatile int abort'-Element enthält, das den Thread anweist, seine Schleifen zu stoppen. Da die Hauptfunktion nur schreibt und der Thread nur liest und beide Operationen effektiv atomar sind (wir ändern hier nur ein Bit) brauche ich keinen Mutex dafür. Sie haben auch Recht, dass mir der Rückgabewert egal ist. –
Sie sind falsch, @MichelRouzic. Eine "volatile" Variable hat nicht die von Ihnen benötigte Semantik. Sie könnten eine Variable mit * atomic * -Typ verwenden, aber ich bin mir nicht sicher, ob MSVC das unterstützt, zumindest mit C11-Syntax. In jedem Fall brauchen Sie einen Lebenslauf, und deshalb brauchen Sie einen Mutex, also die ganze Frage von "volatile" * vs *. Atom * vs *. Vanille ist strittig. –
Also sollte ich den Thread vom Start lösen, den größten Teil seines Codes in einen Mutex legen, dann im Hauptthread sollte ich meine abort-Variable setzen und dann versuchen, den Mutex zu sperren (dann entsperren Sie ihn sofort), was den Hauptblock blockieren würde thread bis der Thread ziemlich fertig ist, richtig? Es scheint tatsächlich eine ziemlich elegante Lösung zu sein, danke! Ich denke, eigentlich konnte ich den Haupt-Thread nicht blockieren und eine zweite Instanz des Threads starten, der Mutex würde die zweite Instanz blockieren, bis die erste Instanz ihren Mutex entsperrt, was sogar noch besser sein könnte. –