/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
Bech_bb 500
kyllekylle 500
jdjespers.. 500
gibson 300
scootergr.. 300
molokyle 287
10  strarup 270
Peterson
Fra : Ukendt


Dato : 17-06-07 09:51


Hej ,

Jeg sidder og spekulerer programmerer en slags extention til en embedded
device, hvor min "main" bliver kaldt nogle gange i sekundet, derudover
kaldes alle de callbacks jeg har registreret "asynkront og i real-time" som
der så kryptisk står et sted.
Alle mine callbacks lægger blot de modtagne data/ events i en kø struktur,
som "main" rutinen så checker hver gang den bliver kaldt.
Nu er min skræk at min main bliver afbrudt af en callback, således at
køstrukturen bliver smadret.

Devicen kører vist nok et Nucleus OS, som er preemptive, og jeg har ingen
muligheder for at disable interrupts for at beskytte min køstruktur. Og jeg
har ingen adgang til Nucleus funktioner

Så bruger man en Peterson mutex, eller noget andet, eller ?

Vi har så fantastisk dårlig support fra den kinesiske leverandør, at jeg
ikke engang ved om de 8 callbaks bliver kaldt fra samme task-kontekst, eller
om de potentielt kaldes fra hver deres.
Det vil så sige at jeg skal bruge en 9 vejs mutex ? :-|

Hints / Links ?

tpt



 
 
Ukendt (17-06-2007)
Kommentar
Fra : Ukendt


Dato : 17-06-07 10:15

>
> Jeg sidder og spekulerer programmerer en slags

Ja, på en god dag er det set, at begge dele indtræffer samtigt.






Ukendt (19-06-2007)
Kommentar
Fra : Ukendt


Dato : 19-06-07 21:13

.... 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




Ukendt (19-06-2007)
Kommentar
Fra : Ukendt


Dato : 19-06-07 21:48

> Mangler en n-way implementation i c.
>

hmm checkede denne igen, og den kan da vist:
http://en.wikipedia.org/wiki/Lamport%27s_bakery_algorithm

tpt



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste