Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

29.03.2010, 18:16

boost::thread ist joinable obwohl beendet

Hallo zusammen,

ich habe ein Problem mit der Funktion boost::thread::joinable(). Ich möchte damit überprüfen, ob ein Thread noch läuft oder ob er beendet ist. Die Doku sagt dazu: "Returns: true if *this refers to a thread of execution, false otherwise." Das "thread of execution" deute ich so, dass es heißt, dass der Thread noch läuft. Das scheint allerdings bei mir nicht zu funktionieren. Ich habe dazu einmal folgendes kurzes Test-Programm erstellt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <boost/thread.hpp>

class A
{
public:
    A() {}
    ~A() {std::cout<<"Objekt wurde zerstört"<<std::endl;}
};

void test()
{
    A b;
}

int main()
{   
    boost::thread t(test);
    boost::this_thread::sleep(boost::posix_time::seconds(1));
    if(t.joinable())
        std::cout<<"Thread läuft noch"<<std::endl;
    else std::cout<<"Thread wurde beendet"<<std::endl;
    return 0;
}


Es wird also ein Thread erstellt mit der Hauptfunktion "test". Diese tut nichts weiter als ein Dummy-Objekt zu erstellen und gleich wieder zu zerstören, damit ich die Bestätigung habe, dass die Funktion beendet ist. Nachdem der Thread erstellt wurde wird eine Sekunde gewartet - der Thread sollte also auf jeden Fall beendet sein (wie auch das Dummy-Objekt bestätigt). Anschließend prüfe ich (meiner Meinung nach) mit t.joinable, ob der Thread beendet wurde. Die Ausgabe ist: "Thread läuft noch"

Wenn ich allerdings vor dem Aufruf von t.joinable t.join aufrufe kommt die Meldung "Thread wurde beendet".

Habe ich hier einen Denkfehler oder liegt ein Fehler vor?

Vielen Dank!

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

29.03.2010, 20:55

Thread of execution heißt einfach nur, dass das Objekt ein Thread ist. Es wird nichts über den aktuellen Status ausgesagt.
@D13_Dreinig

3

30.03.2010, 19:14

Gibt es denn eine andere, sichere Möglichkeit, herauszufinden, ob der Thread beendet wurde?

Eine Variable dafür zu benutzen, die ich am Ende des Threads auf false setze, finde ich nicht so schön. Denn der Thread kann ja durchaus an mehreren Punkten verlassen werden, außerdem muss ich dafür dann noch einen extra Mutex anlegen und entsprechend nachführen.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

30.03.2010, 19:35

Ja, z.B. timed_join
@D13_Dreinig

5

31.03.2010, 20:47

Funktioniert super, danke!

Werbeanzeige