Një nga përjashtimet që ndodhin rrallë në aplikacionet me shumë fije.

Një gjendje e rrëshqitur është një nga përjashtimet e rralla në aplikacionet me shumë fije gjatë kohës së ekzekutimit. Ndodh shumë rrallë, por duhet t'i hedhim një sy nëse rezultati nuk është ashtu siç pritej. Një fill pezullohet pas leximit të kushtit dhe përpara se të ekzekutojë deklaratat ose aktivitetet e tij quhet kusht i rrëshqitur.

Skenari: Konsideroni se dy threads janë të disponueshëm të quajtur Thread-A dhe Thread-B dhe duhet të përpunojë një varg S. Fillimi Thread-A filloi të përpunojë një varg S dhe kontrollon që ndonjë karakter tjetër të ketë mbetur për t'u përpunuar, fillimisht i gjithë vargu është në dispozicion për t'u përpunuar kështu që kushti është i vërtetë.

Pas përpunimit, i gjithë vargu Thread A pezullohet dhe Fillimi B fillon të përpunojë vargun. Ai përsëri kontrollon kushtin që vlerëson të vërtetën dhe më pas përpunon të gjithë vargun S.

Tani Thread-A filloi të ekzekutonte përsëri të gjithë vargun S të përpunuar deri në këtë kohë, kështu që ndodh një gabim. Ky lloj gabimi quhet kushti i rrëshqitur.

Ju lutemi gjeni lidhjen e mëposhtme të kodit GitHub për gjendjen e rrëshqitur:



Për çështjen e mësipërme zgjidhja është shumë e thjeshtë dhe e drejtpërdrejtë. Çdo burim që një thread do të hyjë pas kontrollit të gjendjes, duhet të bllokohet nga thread dhe duhet të lirohet vetëm pasi puna të kryhet nga thread. E gjithë aksesi duhet të sinkronizohet.

Çështja e mësipërme e gjendjes së rrëshqitjes mund të eliminohet duke kontrolluar se filli ishte ose i kyçur ose jo në çdo kohë të kontrollit të gjendjes.

Ju lutemi gjeni zgjidhjen e mëposhtme të problemit të gjendjes së rrëshqitur në GitHub:



Në kodin e zgjidhjes, ne kemi shtuar një variabël boolean "isLocked" dhe fillimisht është inicializuar me një vlerë false. sa herë që thread përpiqet të hyjë në burim, ai merr bllokimin me fije. pasi të përfundojë procesi, ai hiqet. kështu që sa herë që thread kontrollon nëse "is Locked" është false apo jo.

Nëse vlerat e tij janë false, atëherë ekziston një karakter për t'u përpunuar. Nëse nuk është, atëherë nuk ka karaktere për t'u përpunuar.