Avatar billede rrm Nybegynder
29. august 2006 - 23:57 Der er 16 kommentarer og
1 løsning

Valg af synckroniseringen metode

Hejsa

Jeg har et spørgsmål angående hvilken c++ synckroniserings løsning der er bedst, nemmest at implementere (kender ikke så meget til windows synckronisering metoder, men jeg har rodet noget med Java metode (synchonized(this) {})).

Synckroniseringen skal kunne håndterer tre forskellige processer tilgår de kritiske data (både læse og skrive), via en delt klasse. De tre proceeser skal kunne kører samtidigt uden at der opstår race condition når den delte resource tilgås.

Jeg har kigge lidt på WaitForsingleObject eller Semaphore klassen.
Avatar billede bertelbrander Novice
30. august 2006 - 00:07 #1
Snakker vi C++ eller .net?

Hvis det er C++ må svaret være semaphore. Start med at lave en med CreateSemaphore:
http://windowssdk.msdn.microsoft.com/en-us/library/ms682438.aspx

ReleaseSemaphore frigiver den og man kan bruge en af de mange wait funktioner til at vente. Hvis man kun skal vente på den ene semaphore er WaitForSingleObject nok sagen.
Avatar billede bertelbrander Novice
30. august 2006 - 00:24 #2
Du skriver "processer" er det separate programmer eller eller tråde i samme program?
Avatar billede arne_v Ekspert
30. august 2006 - 04:40 #3
java synchronized er mellem tråde
Avatar billede arne_v Ekspert
30. august 2006 - 04:42 #4
jeg plejer at bruge

struct CRITICAL_SECTION

InitializeCriticalSection
EnterCriticalSection
LeaveCriticalSection

til det formål

men jeg er ikke den store Win32 guru
Avatar billede rrm Nybegynder
30. august 2006 - 14:44 #5
Det er c++ og programmet er en dll, der har to tråde, samt at det skal være mulig fra bruger applikationen at tilgå strukturen
Avatar billede bertelbrander Novice
30. august 2006 - 21:40 #6
I så fald bør du kunne bruge en semphore eller en Critical Section. En Semaphore er lidt mere flexibel.

Da det er en dll skal du nok overveje hvad der sker hvis der er flere applikationer der bruger dll'en på samme tid.
Avatar billede arne_v Ekspert
31. august 2006 - 04:13 #7
hvis vi antager at det er java synchronized du søger, så er du all set
uanset dll eller ej - dll er bare hvor noget kode befinder sig (ligesom jar
i Java)

hvis det skal være mellem processer så skal det være Semaphore (eller Mutex)
Avatar billede rrm Nybegynder
31. august 2006 - 21:34 #8
ok, det skal ikke være mellem processer, blot beskytte en kritisk resource mod race condition fra to tråde samt fra værts programmet. Har hvert program der bruger en dll, ikke hvert sit område, der gemmer tilstanden af dll (variabler m.fl)???
Avatar billede arne_v Ekspert
31. august 2006 - 22:36 #9
jo
Avatar billede rrm Nybegynder
16. september 2006 - 23:18 #10
et andet spørgsmål, hvis jeg nu bruger CriticalSection, hvordan skal følgende java-kode så oversættets???

sender:
synchronized(this)
{
notify()
}

modtager:
synchronized(this)
{
wait()
}

Vil en god oversættelse til c++ så være:

sender
EnterCriticalSection()
SetEvent(evt) <-- skal notificerer evt
LeaveCriticalsection()

modtager
EnterCriticalSection()
// do something
LeaveCriticalSection()
WaitForSingleObject(evt)
EnterCriticalSection()
// do something
LeaveCriticalSection()

???
Avatar billede arne_v Ekspert
30. september 2006 - 20:52 #11
det kan jeg ikke helt gennemskue, men umiddelbart ser det ikke ud til at gøre det samme
Avatar billede rrm Nybegynder
05. januar 2007 - 13:59 #12
hvad mener du med det???
Avatar billede arne_v Ekspert
15. januar 2007 - 01:22 #13
hvis der er mere end en modtager tror jeg at det vil være markant anderledes

den sidste critical section blok i modtager ved jeg ikke om den passer ind
Avatar billede rrm Nybegynder
20. februar 2007 - 10:53 #14
ok, jeg har implementeret håndteringen af de to tråde med hvert deres event og så sørget for at den rigtige event bliver kaldt i SetEvent/WaitForSingleObject.

Ved ikke om det er den bedste metode??
Avatar billede rrm Nybegynder
23. januar 2009 - 23:00 #15
Hej Arne_v og Bertel. Tak for hjælpen... Lig et svar for point...
Avatar billede arne_v Ekspert
24. januar 2009 - 00:42 #16
svar
Avatar billede bertelbrander Novice
24. januar 2009 - 01:00 #17
& jeg samler stadig ikke på point.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester