[an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive]
 
[an error occurred while processing this directive] [an error occurred while processing this directive]
Skåne Sjælland Linux User Group - http://www.sslug.dk Home   Subscribe   Mail Archive   Forum   Calendar   Search
MhonArc Date: [Date Prev] [Date Index] [Date Next]   Thread: [Date Prev] [Thread Index] [Date Next]   MhonArc
 

Re: [PROGRAMMERING] Mystisk pthread_cond_wait fejl (muligvis en bug)



Hej Morten

Det er pracis det jeg oplever. Det er rart at vide at det er et kendt problem samt at POSIX ikke helt følger standarden men at der er mulighed for at tvinge den til det. Din løsning med at behandle samtlige date duer desværre ikke. Årsagen er at condition og mutex beskytter et lagerområde og dette område må IKKE overskrives før hovedløkken har behandlet data. For hvert signal er der nye data.

Mange tak for oplysningerne.


Morten Sylvest Olsen wrote:


Anders Gnistrup wrote:

Hej Alle

Jeg her et program som skal loade et billede op i et windue og det ser sådan set perfekt ud, bortset fra at jeg skal lave en lille hack. Hack virker men det burde faktisk ikke være nødvendigt og jeg er i tvivl om det er en bug.

Mit program består (skematisk) af følgene

hovedprogram (styre/visning):
====================================== err = (pthread_mutex_init(&pic->mutex, NULL) != 0 ||
pthread_cond_init(&pic->cond, NULL) != 0);


if (!err)
pthread_mutex_lock(pic->mutex);

err = pthread_create(&thread, NULL, load_func, pic);

while(så lange der er data)
{
if (pthread_cond_wait(&pic->cond, &pic->mutex) != 0)
/* lave noget behandling */
else
fejlmelding;
}


Husk pthread_mutex_unlock efter løkken.

Thread til load af billede (load_func)
===================================
void *load_func(void *arg)
   {
       pic = arg;
      while (så længe der er noget i filen)
         {
         læs data;
          pthread_mutex_lock(&pic->mutex);
          /* læser en linie fra fil */
          pthread_cond_signal(pic->cond);
          pthread_mutex_unlock(pic->mutex);
      }     }
end


Er der nogen der har en god forklaring på det her?


Du kan ikke regne med at dine tråde opfører sig ordentligt og skiftes til at køre. Du ser formodentligt en fletning som følgende:


load_func: main: ... cond_wait

lock
signal
unlock
..
lock
signal
unlock
..
lock
signal
unlock
                 behandling
                 cond_wait


Når du kalder usleep fremkalder du et trådskifte, du ville formodentligt opnå det samme ved at kalde sched_yield().


Hvad du bør gøre er nok at lave hovedtråden som:

while (90210) {

   while (hasData()) {
      doData();
   }

   // bliv ved med at vente sålænge der ikke er noget data,
   // også hvis der kommer en spurious wake-up
   pthread_mutex_lock
   while (!hasData()) {
     pthread_cond_wait
   }
   pthread_mutex_unlock

}

Ok så skal du selvfølgelig også sørge for at data er beskyttet sådan så at hasData() og doData() virker korrekt selvom producenten er ved at indlæse noget mere. Det er et klassisk problem kaldet producer-consumer. Prøv at finde noget om det på google eller i en lærebog omkring parallelprogrammering.

Mvh Morten




 
Home   Subscribe   Mail Archive   Index   Calendar   Search

 
 
Questions about the web-pages to <www_admin>. Last modified 2005-08-10, 22:44 CEST [an error occurred while processing this directive]
This page is maintained by [an error occurred while processing this directive]MHonArc [an error occurred while processing this directive] # [an error occurred while processing this directive] *