pthread: mutex & conditional
-
hi,
ich schreib grad eine kleine client-server anwendung mit select() und pthreads. mein problem ist die anordnung von pthread_mutex_lock(), pthread_mutex_unlock() und pthtread_cond_signal(). also so soll es ablaufen:
1. select() sagt an, dass der client daten empfängt
2. daten werden auf ein fifo geschrieben
3. dem worker-thread für diesen client ( jeder hat ein eigenen ) wird signalisiert, dass neue daten da sind
4. worker-thread arbeiten den fifo ab.hier ist der code von select():
else if( retval > 0 ) { pthread_mutex_lock( &client->mutex ); printf( "%i / %i\n", fifo_get_pointer( client->fifo ), fifo_get_size( client->fifo ) ); if( fifo_puts( client->fifo, buffer, retval ) == NESLFT ) printf( "no space left\n" ); pthread_cond_signal( &client->cond ); pthread_mutex_unlock( &client->mutex ); }
das problem an der ganzen sache ist nun, dass der worker-thread nicht bei jedem ankommenden packet ein signal bekommt sondern erst wenn das gesamte empfangen beendet ist - sprich der aufruf pthread_cond_signal( &client->cond ); wird bei 20 paketen nur einmal ausgeführt.
hier stdout:
0 / 2048 7 / 2048 14 / 2048 21 / 2048 28 / 2048 35 / 2048 42 / 2048 49 / 2048 56 / 2048 63 / 2048 70 / 2048 77 / 2048 84 / 2048 91 / 2048 98 / 2048 105 / 2048 112 / 2048 119 / 2048 126 / 2048 133 / 2048 thread
hier noch der code für den worker-thread:
while( TRUE ) { pthread_mutex_lock( ¶m->mutex ); pthread_cond_wait( ¶m->cond, ¶m->mutex ); printf( "thread\n" ); ...
kann mir da jemand helfen?
mfg blan
-
Hi,
ich bin mir nicht 100%ig sicher. Aber der Gebrauch von mutex und cond scheint richtig zu sein.
Vielleicht kannst du ein komplettes Programm posten, damit man da mal nachgehen kann.
Was ich mir gut vorstellen könnte: Die Pakete kommen so schnell, dass der Thread keine Zeit hat, sich für den Erhalt der Condition den Mutex zu loggen.
Aber dafür müsste man den ganzen Code sehen.
Gruß mcr
-
mcr schrieb:
Hi,
ich bin mir nicht 100%ig sicher. Aber der Gebrauch von mutex und cond scheint richtig zu sein.
Vielleicht kannst du ein komplettes Programm posten, damit man da mal nachgehen kann.
Was ich mir gut vorstellen könnte: Die Pakete kommen so schnell, dass der Thread keine Zeit hat, sich für den Erhalt der Condition den Mutex zu loggen.
Aber dafür müsste man den ganzen Code sehen.
Gruß mcr
du könntest recht haben. ich hab die sache aber eh zu kompliziert gelöst mit den threads. mit select() lässt sichs viel eleganter lösen. trotzdem danke.
mfg blan