.... fortsat
Det der også forvirrer mig lidt er, at der står i en lærebog et sted, at man
må endelig ikke undervurdere snedigheden i sådan en mutex, selv om det bare
er nogle flag der bliver manipuleret. Det sker i den HELT rigtige
rækkefølge, hvilket gør at to tasks ikke begge kan tro, at de vandt mutexen.
flag[0] = 0
flag[1] = 0
turn = 0
P0: flag[0] = 1
turn = 1
while( flag[1] && turn == 1 );
// do nothing
// critical section
...
// end of critical section
flag[0] = 0
P1: flag[1] = 1
turn = 0
while( flag[0] && turn == 0 );
// do nothing
// critical section
...
// end of critical section
flag[1] = 0
(fra
http://en.wikipedia.org/wiki/Peterson's_algorithm)
Hvis jeg så går med til at dette kan lade sig gøre på konceptuelt niveau, så
er det vel ikke sikkert at det bliver rigtigt når man skriver det i c, fordi
compileren kunne finde på at omarrangere lidt på koden. Og selv hvis man
lavede det i assembler, så er det at assigne en variabel på nogle platforme
én assembler instruktion, på andre kunne det kræve en load over i et
register, additionen, og til sidst en store ud i memory igen. Er jeg
paranoid her ?
Studerer boost::mutex, men der er sq en del at læse !
Mangler en n-way implementation i c.
tpt