[OSy] mutexy

Petr Tuma petr.tuma at dsrg.mff.cuni.cz
Wed Oct 31 19:46:58 CET 2007


Dobry vecer,

> Povedzme, ze vlakno A zamklo mutex a do fronty cakatelov sa zaradili  
> vlakna B,C,D (pricom C bude cakat iba 100ms). Po 50ms vlakno A odomkne  
> dany mutex (co podla zadania znamena, ze vlakna B,C,D sa zobudia a zacnu  
> bojovat o to, ktore z nich prve zamkne mutex). Nie je mi dost jasne, ako  
> dokazeme zistit, ci to dane vlakno stihne este zamknut.
> 
> Specialne teda: niekde v kode funkcie mutex_lock_timeout sa vola  
> thread_sleep(usec). Za tento prikaz sa dostane vlakno po tom, co vyprsi  
> cas, alebo doslo k mutex_unlock. Ak vyprsal cas, je jasne, ze vratime  
> ETIMEDOUT. Ak ale este nevyprsal, nedokazeme podla mna rozhodnut v danom  
> volani funkcie mutex_lock_timeout, ci to este to vlakno stihne, a teda ani  
> rozhodnut aku navratovu hodnotu ma mat funkcia...
> 
> ... alebo som to pochopil zle?

Uvazuji vas priklad. Vlakno A ma zamceny zamek, B, C, D na nej cekaji, C 
ma jedine timeout 100 ms.

Pote co A odemkne zamek, nektere z vlaken B, C nebo D se dostane na radu 
(podle toho, jestli vas zamek zarucuje treba FIFO nebo ne). Zadani 
nevyzaduje, aby se vzbudila vsechna vlakna, muze se klidne vzbudit jen 
to jedno, ktere ma prijit na radu (nebo vsechna, ale pak se az na jedno 
zase uspi).

(Z vaseho popisu mam dojem, jako kdybyste ocekaval, ze se v tuto chvili 
vsechna vlakna vrati z funkce lock, ale to neni pravda, z funkce lock se 
vrati vlakno jen kdyz ma uspesne zamceny zamek nebo doslo k nejake chybe 
ci timeoutu.)

Pokud predpokladame, ze na rade bude vlakno C, pak se mu podari zamknout 
zamek, vrati EOK.

Pokud se na radu dostane jine vlakno, ktere bude drzet zamek jeste 
dalsich 50 ms, vlaknu C mezitim dojde timeout a vrati ETIMEDOUT.

Petr Tuma




More information about the NSWI004 mailing list