deadlock. synchronizacja

deadlock. synchronizacja
damiannno
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:68
0

Witam mam następujący problem.
Mam jednego producenta który pobiera dane z pliku o czasach równych rozkładowi normalnemu m=0.1 s=0.01 i umieszcza daną na kolejce.
Dwóch producentów czyta z kolejki - pierwszy o czasach m=0.15 s=0.2 oraz drugi o czasach m=1.2 s=0.3.
Zrobiłem do tego synchronizacje. Program 10 razy działa a za którymś razem się nie kończy dochodzi do deadlocka.
Doszedłem do tego, że dzieje się tak dlatego że w metodzie run producenta :

void run{
while(reader.hasNext()){
//wywolanie funkcji dodania do kolejki ktora jest zsynchronizowana w sposób taki że jeżeli kolejka jest pełna (koncepcja rozmiaru kolejki jako parametr programu) to wait()
}

ustawienie flagi na 0 - producent zakonczyl prace

}

i właśnie wątek czytający wdziera mi się pomiędzy koniec while a początek ustawiania flagi co skutkuje ciągłym wait() w funkcji synchronizującej konsumentów.
Mam pytanie jak z tego wybrnąć?

Bo już zatarłem sobie zęby i nie mam pomysłów.

edytowany 3x, ostatnio: damiannno
init0
  • Rejestracja:prawie 12 lat
  • Ostatnio:24 dni
  • Lokalizacja:2 Sm 12
0

Możesz rozwinąć kwestie czasu czytania z kolejki? Ja na twoim miejscu napisałbym sobie junita dla testu na funkcje, sprawdził jak działa, dodał parametr synchronized do funkcji i sprawdził jeszcze raz, trudno ocenić co nie działa jak dałeś 4 linijki kodu. Taka sytuacja zachodzi jak jedna zmienna jest modyfikowana przez kilka wątków jednocześnie.


Raz przyszedł gość do bogacza
lecz jemu żal było brać coś z owiec i własnego bydła
czym mógłby posłużyć podróżnemu który do niego zawitał
Więc zabrał owieczkę owemu biednemu mężowi
i tę przygotował człowiekowi, co przybył do niego
edytowany 2x, ostatnio: init0
damiannno
może wrzucę treść będzie szybciej...
damiannno
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:68
0

Już sobie poradziłem.

init0
może warto umieścić rozwiązanie dla przyszłych osób szukających rozwiązań żeby nie powstawało sryliard podobnych tematów.
damiannno
owszem wstawię ale po zaliczeniu programu ponieważ to było kolejne zadanie zaliczeniowe dla 60 osób na PK. Jak ktoś podgapi kod to obleje ;)
init0
no problem, nie pisze o całym kodzie a o samym rozwiązaniu jednej metodzie lub opisie słownym nikt ci nie karze wklejać kodu co było by niedorzeczne.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.