Pisałem program, który uruchamia dwa procesy.Dwa typy wiadomości w kolejce wiadomości
Pierwszy proces, "klient" wysyła dwa rodzaje wiadomości.
Pierwszy typ zwiększa współużytkowany zasób (int). Drugi typ ustawia zasób na 0.
Po 10 wiadomościach klient musi wysłać wiadomość o specjalnym typie, która spowoduje zatrzymanie wątków nasłuchujących w dwóch kolejkach. Tak więc klient wysyła dwie wiadomości (jedną dla każdej kolejki) ze specjalną wartością w polu typu, aby zakończyć wątki.
Drugi proces to "serwer".
Serwer posiada trzy wątki:
pierwszy nasłuchuje w kolejce „wzrost”. Musi obsłużyć żądanie zwiększenia do czasu komunikatu o zakończeniu. Więc napisałem:
do{
msgrcv(id_i,&msg,dimensione,INCREMENTA,0);
pthread_mutex_lock(&mutex);
printf("THREAD 1: Il contatore vale:%d\n",*contatore);
incremento = msg.contenuto;
printf("THREAD 1: Incremento di : %d\n",incremento);
*contatore+=incremento;
printf("THREAD 1: Il contatore vale:%d\n",*contatore);
pthread_mutex_unlock(&mutex);
msgrcv(id_i,&msg,dimensione,TERMINA,IPC_NOWAIT); //IPC_NOWAIT or the thread will
freeze after the first message
}
while(msg.tipo!=TERMINA);
Drugi musi obsłużyć „ustawiony na” 0 żądań aż pojawi się komunikat o zakończeniu.
do{msgrcv(id_a,&msg,dimensione,AZZERA,0);
pthread_mutex_lock(&mutex);
printf("THREAD 2: IL CONTATORE VALE:%d\n",*contatore);
*contatore=0;
printf("Thread 2: Contatore azzerato. Ora vale : %d\n",*contatore);
pthread_mutex_unlock(&mutex);
msgrcv(id_a,&msg,dimensione,TERMINA,IPC_NOWAIT);//IPC_NOWAIT or the thread will
freeze after the first message
}
while(msg.tipo!=TERMINA);
Trzeci wątek zwiększa wartość zasobu przy użyciu muteksu w celu wzajemnego wykluczenia.
Problem polega na tym, że wątek1 i wątek2 procesu serwera nie kończą się w miejscu, w którym powinny. W rzeczywistości utknęły one na pierwszym msgrcv() po wszystkich komunikatach increase/set0. Problem polega na tym, że dwa wątki nie są w stanie odsłuchać komunikatu o zakończeniu.
Próbowałem ustawić IPC_NOWAIT również dla pierwszego msgrcv ale nie działa
Rozumiem. Odpowiedź została zaakceptowana. – EagleOne