[C++] [Threads] pthread_t id probleem/onduidelijkheid

Pagina: 1
Acties:

  • loial
  • Registratie: Januari 2001
  • Laatst online: 17-09-2024
Ik stuit op een probleem bij het gebruik van threads in het programma dat ik aan't schrijven ben.
Ik start in main een functie genaamd create_a() (functie namen vereenvoudigd ter duidelijkheid) en die maakt een thread die de functie a_main uitvoert mbv de functie pthread_create( id, NULL, a_main, NULL) en returned dan.
Deze a_main wacht totdat er een telnet verbinding binnenkomt en als dat gebeurt dan start deze a_main de functie create_a() weer op (zodat er weer een a_main uitgevoerd wordt die op een telnet verbinding wacht) en dan handelt hij de telnet verbinding af.

Alle id's die pthread_create teruggeeft worden opgeslagen in een linked list.
Om de positie in de linked list te vinden moet de waarde van pthread_self() vergeleken worden met de opgeslagen id waarde. Hier komt het probleem. De waarde die pthread_create teruggeeft is steeds gelijk aan die waarde die de eerste keer teruggegeven wordt. M.a.w. de 2e en volgende keren dat create_a een thread maakt voor de functie a_main krijgen steeds dezelfde id. Op deze manier werkt het zoeken in de linked list natuurlijk niet, omdat ik steeds bij de 1e thread uitkom.

Ik zou graag willen weten of dit gedrag van pthread_create zo hoort :) In mijn geval is het namelijk niet gewenst dat als een functie meerdere malen in een thread uitgevoerd wordt, die thread dan dezelfde id krijgt. Is dit te verhelpen?

Het herschrijven van mijn programma zodat hij hier geen problemen meer mee heeft is altijd een optie, maar die wil ik nu nog niet gaan toepassen. Ik wil eerst kijken of mensen hier misschien ervaring mee hebben opgedaan en die ervaring willen delen ;)

Ik heb (natuurlijk!) de man pages van pthread_create en andere pthread_ functies doorgelezen, maar daar wordt niet ingegaan op de id. Google levert meerdere functiebeschrijvingen op, maar deze zijn allen bijna gelijk aan die van de man pages.

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19

D2k

vreemd dat het dezelfde id's oplevert
heb je misschien een relevant stukje source? dat ik ook ff kan testen :?

Doet iets met Cloud (MS/IBM)


  • igmar
  • Registratie: April 2000
  • Laatst online: 23-08 16:57

igmar

ISO20022

Loial schreef op 10 augustus 2002 @ 16:16:
Ik stuit op een probleem bij het gebruik van threads in het programma dat ik aan't schrijven ben.
Ik start in main een functie genaamd create_a() (functie namen vereenvoudigd ter duidelijkheid) en die maakt een thread die de functie a_main uitvoert mbv de functie pthread_create( id, NULL, a_main, NULL) en returned dan.
Deze a_main wacht totdat er een telnet verbinding binnenkomt en als dat gebeurt dan start deze a_main de functie create_a() weer op (zodat er weer een a_main uitgevoerd wordt die op een telnet verbinding wacht) en dan handelt hij de telnet verbinding af.
Waarom zo moeilijk ? select() gebruiken, en op de accept een pthread_create();
Alle id's die pthread_create teruggeeft worden opgeslagen in een linked list.
Om de positie in de linked list te vinden moet de waarde van pthread_self() vergeleken worden met de opgeslagen id waarde. Hier komt het probleem. De waarde die pthread_create teruggeeft is steeds gelijk aan die waarde die de eerste keer teruggegeven wordt. M.a.w. de 2e en volgende keren dat create_a een thread maakt voor de functie a_main krijgen steeds dezelfde id. Op deze manier werkt het zoeken in de linked list natuurlijk niet, omdat ik steeds bij de 1e thread uitkom.
Welke waarde gebruik je ?? De waarde die de functie zelf teruggeeft is NIET het thread_id, die staat in pthead_t (eerste argument), dat eigenlijk een unsigned long is.

pthread_t tid;

pthread_create(&tid, .....);
Die tid moet je in de linked list zetten, dat is ook degene die je terugkrijgt van pthread_self();

Indien je nog steeds problemen houd gaarne stukken code, aangezien hetgeen wat jij wil hier prima werkt.

Verwijderd

Is het niet makkelijker om een thread te hebben die constant luistert en dan de inkomende connecties over te leveren aan een nieuwe thread? Dan heb je tenminste constant een listener op de poort, in jouw geval heb je steeds korte stukjes geen listener ten tijde dat de listener zichzelf omvormt tot session en een nieuwe listener wordt aangemaakt...

voor de rest, pthread_create() returnt 0 als het gelukt is en anders -1 (en dan wordt errno geset). 't Is dus idd geen thread ID.

  • loial
  • Registratie: Januari 2001
  • Laatst online: 17-09-2024
de return value gebruik ik idd niet als thread_id, zover was ik nog net wel ;)

je hebt gelijk beelzebubu dat een constante listener z'n voordelen kan hebben, maar dat is niet het punt waarop ik strand.
Ik ben nu even aan't kijken of ik wat code kan planten hier
edit:
, maar dat zal ben ik bang niet compileerbaar zijn, dus kweet niet of je er wat aan hebt

[ Voor 0% gewijzigd door loial op 10-08-2002 16:49 . Reden: toevoeging ]


  • loial
  • Registratie: Januari 2001
  • Laatst online: 17-09-2024
Ok, dit is fijn:)
Ik heb net een testprog gemaakt die simpel de thread_id op je scherm zet, en die krijgt wel steeds een andere id. Hoogstwaarschijnlijk moet ik het dus toch in mijn eigen code zoeken. Ik zoek nog even verder, als ik het euvel gevonden heb, zal ik het even melden:)
Pagina: 1