Forvirring om tråden synkronisering når to tråder den samme metoden

stemmer
0

Jeg har opprettet en Messenger bibliotek og jeg har gjort det træ trygt slik at den kan deles rundt mellom tråder uten bekymringer. Jeg oppnå dette stort sett ved hjelp av Monitor klassen.

Jeg har en Logg rutine som kan ta litt tid å fullføre fordi den prøver å vente på transaksjoner som finner sted før den slår seg av kontakten etc. Det er asynkron og har begin / end metoder, men for dette eksempelet vil vi bare late som det er synkron.

Hva om to tråder kalle Logg av, en rett etter hverandre? Hva bør jeg gjøre med den andre tråden?

Foreløpig jeg blokkere (ved hjelp Monitor.Wait å vente på en puls fra første tråd) til den første utlogging fullfører og deretter kaste en AlreadyLoggedOutException.

Jeg har også lekt med å ha en LogoutInProgress unntak kastes hvis Logg kalles men en utlogging allerede pågår.

Begge synes å ha fordeler og ulemper, men jeg vil gjerne vite hva andre synes er best.

Publisert på 08/04/2012 klokken 22:43
kilden bruker
På andre språk...                            


2 svar

stemmer
2

Hva er det beste alternativet ut av de to du nevnte, er avhengig av hvordan du vil at biblioteket skal oppføre seg.

Jeg ville ikke kaste unntak for forbrukeren og bare fyre slutten utlogging async event / metode for begge trådene når selve utlogging fullført. Hvilke synkronisering primitive du bør bruke for å oppnå dette avhenger av utformingen av metode / bibliotek. Kanskje hvis du deler flere detaljer om Begynn End metoden du nevnte, vil jeg være i stand til å foreslå bedre.

Dette alternativet ville være lettere å programmere mot.

Svarte 08/04/2012 kl. 22:53
kilden bruker

stemmer
0

Det er et tredje alternativ: Den andre tråden prøver å logge ut kunne oppdage at en utlogging allerede skjedd og gjøre ingenting. Dersom kontrakten for "Logg ut" er "enten sørge for at brukeren er logget ut, eller kaste" så bør du faktisk gjøre Logg idempotent.

Men hvis du ikke kan tolerere flere avlogginger fordi det ville være en logisk feil en eller annen måte bør du kaste et unntak.

Svarte 08/04/2012 kl. 23:45
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more