Forum: PC-Programmierung Mehrere Threads auf eine PThread struktur


von Michael D. (Gast)


Lesenswert?

Hallo zusammen,

wenn ich eine globale Variable
1
pthread_t stackworker;

habe und mit
1
pthread_create(&stackworker,NULL,&WorkerThread,this)

einen Thread (Thread 1) erzeuge, wird ein Thread erzeugt und 
abgearbeitet.
1
void * WorkerThread(void * arg) {
2
3
    // Process stack
4
    return NULL;
5
}

Wenn ich nun einen weiteren Thread (Thread 2) auf die 
Stackworkervariable erzeuge noch bevor Thread 1 beendet ist, so wird der 
Thread 2 erzeugt sobald Thread 1 endet.

Dies ist der Zustand den ich eigentlich möchte, nur:
Ist diese Methode auch so zulässig (evtl. Speicherlecks, etc...)??

Danke,
Michael

Background:
Ich habe Funktionen welche zwar sofort zurückkehren aber eine weitere 
Bearbeitung durch eine Messagequeue benötigen. Diese Queue bearbeite ich 
im Thread, welchen ich auch in der jeweiligen Funktion erzeuge. Die 
Queue im Thread wiederum kann eine Callbackfunktion aufrufen, welche 
wiederum eine Funktion aufruft welche einen Queue benötigt. D.h. Es wird 
ein neuer Queuethread in einem Queuethread erzeugt.
Die Threads sollen dabei nacheinander ablaufen.
1
void Foo1() {
2
 ...
3
 createThread();
4
}
5
6
void Foo2() {
7
 ...
8
 createThread();
9
}
10
11
void Thread() {
12
  ...
13
  Foo2(); // Thread wird nach Foo2 verlassen
14
}

von Michael D. (Gast)


Lesenswert?

Hat sich erledigt. Es laufen kurzzeitig zwei Threads parallel, Valgrind 
meldet kein Speicherleck.

von Oliver R. (superberti)


Lesenswert?

Hi Michael,

> Hat sich erledigt. Es laufen kurzzeitig zwei Threads parallel, Valgrind
> meldet kein Speicherleck.

Nee, so wird das nichts! Startest Du die Threads zu häufig, dann gehen 
dir die Ressourcen aus, denn

http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_create.3.html

sagt:
1
A thread may either be joinable or detached.  If a thread is joinable, then
2
       another thread can call pthread_join(3) to wait for the thread to terminate
3
       and fetch its exit status.  Only when a terminated joinable thread has been
4
       joined are the last of its resources released back to the system.  When a
5
       detached thread terminates, its resources are automatically released back to
6
       the system: it is not possible to join with the thread in order to obtain its
7
       exit status.  Making a thread detached is useful for some types of daemon
8
       threads whose exit status the application does not need to care about.  By
9
       default, a new thread is created in a joinable state, unless attr was set to
10
       create the thread in a detached state (using pthread_attr_setdetachstate(3)).

Du musst also pthread_join aufrufen, um die Ressourcen des Threads 
freizugeben. Das geht aber nicht, da Du Dir den ersten pthread_t schon 
überschrieben hast...

Gruß,

Oliver

von Michael D. (xaero80c51) (Gast)


Lesenswert?

Hallo Oliver,

vielen Dank für den Hinweis, da wäre ich darübergestolpert!

Ich werde versuchen den Thread nicht zu beenden sondern nur pausieren / 
anhalten.

Dürfte sowieso die bessere Methode sein.

Danke,
Michael

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.