Problem sa novim Ubuntu sistemom i detach-ovanim nitima

20. Maj 2019

Nekoliko studenata je prijavilo da postoji problem sa zadacima koji u sebi sadrže niti koje su detach-ovane. Problem se manifestuje tako da zadaci rade korektno do kraja ali se tik pre završetka zaglave i nikada se ne završe. Ovaj problem se ne javlja u računarskoj učionici i ne javlja se na verziji Ubuntu-a skinutoj sa ACS sajta. Problem se isključivo javlja na najnovijoj verziji Ubuntu Linux-a preuzetog sa Ubuntu sajta.
 
Ovo obaveštenje odnosi se samo na studente kojima se ovaj problem pojavljuje na ličnom računaru. Problem se svakako ne javlja u računarskim učionicama tako da ne utiče na vežbe niti provere. Jedino se domaći zadatak radi kod kuće, pa ako vas ovaj problem pogađa, predlažem da rešenje problema ispratite odmah sada (u slučaju da domaći zadatak sadrži detach-ovanu nit, to još uvek ne znamo).
 
Problem smo analizirali do određene mere i sada ću predstaviti naše zaključke. Problem nije izazvan operativnim sistemom, već C runtime bibliotekom, odnosno verzijom gcc kompajlera. Verzija koju imamo u računarskoj učionici (kao i verzija koja se nalazi isporučena uz Ubuntu sistem koji se preuzima sa ACS sajta) je takva da se prilikom sistemskog poziva exit() niti koje su detach-ovane prekidaju, čak i ako u tom momentu stoje u stanju čekanja (čekaju na notifikaciju neke condition varijable). U novoj verziji, koja izaziva ovaj problem, ovo ponašanje je izmenjeno - poziv exit() funkciji neće prekinuti detach-ovane niti, već će ih ostaviti aktivnim. To dovodi do toga da se ove niti ne završavaju i time sprečavaju uspešno završavanje programa. Nemamo kontrolu nad tim kako se gcc i pripadajuća run-time biblioteka menjaju, pa ovaj problem nismo mogli predvideti.
 
Sledeća rešenja zadataka imaju ovaj problem:
 
09-Procesi/procesi
10-Memorija/sazimanje
10-Memorija/virtuelna_memorija
11-Rasporedjivanje/najkraci_sledeci
 
U prilogu ovog obaveštenja su alternativna rešenja ovih zadataka koja nemaju prethodno opisani problem, odnosno, uspešno se završavaju prilikom pokretanja. Dakle, ako vas ovaj problem pogađa, predlažem da proučite ova rešenja. U nastavku ovog obaveštenja će rešenja biti obrazložena, a potrudićemo se i da na vežbama pružimo odgovarajuća objašenjenja.
 
Opis izmena
 
- U centralnu klasu programa dodato je polje bool zavrsen. Ovo polje treba da pokaže kada su sve niti okončane kako bi se, prateći vrednost ovog polja, mogla završiti i detach-ovana nit. U konstruktoru klase je ovo polje postavljeno na svoju početnu vrednost - false.
- U centralnu klasu programa dodata je public metoda zavrsi() koja postavlja polje zavrsen na true i notifikuje condition varijablu na kojoj detach-ovana nit čeka svoje aktiviranje.
- U metodi koju poziva detach-ovana nit uslov za čekanje je proširen. Sada će nit prekidati svoje čekanje u slučaju da se polje zavrsen postavi na true. Odmah nakon izlaska iz čekanja vrši se provera da li je polje zavrsen postavljeno na true i ako jeste, vrši se izlaz iz metode (čime se izvršenje detach-ovane niti prekida - izlazi se iz while (true) petlje).
- U main.cpp nakon što se izvrši join() svih niti, takođe će se pozvati nova metoda - zavrsi() nad objektom centralne klase. Na ovaj način, test primer će pogasiti sve niti koje su joinable a potom i detach-ovanu nit. Pošto će detach-ovana nit u većini slučajeva biti u stanju čekanja, ova metoda će takođe notifikovati i condition varijablu na kojoj nit čeka, kako bi je probudila iz čekanja i "naterala" je da se završi. 

DodatakVeličina
detach-resenja.zip103.35 KB