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( &param->mutex );
        pthread_cond_wait( &param->cond, &param->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


Anmelden zum Antworten