29. november 2004 - 11:22Der er
10 kommentarer og 1 løsning
Mutual exclusion i C#
Lige et spørgsmål om mutex i C#.
Jeg har brug for at nogle metoder kan eksekveres flere af gangen (Read), mens andre metoder (Write) kun må køres en ad gangen.
Nu er mit spørgsmål så: Hvis jeg lavet en lock på det object jeg bruger til at læse og skrive når jeg writer, kan jeg så være sikker på at andre tråde er færdige med at læse?
Tråde der reader obtainer jo ikke en lock på objectet, da flere tråde godt kan læse på en gang.
Ellers kunne jeg måske boxe en primitive og så tælle den op når en ny reader starter og ned når den er færdig. Men det er jo ikke en hel smuk løsning og vil nok resultere i en masse overhead :/
Tror i følgende vil virke? -------------------------- private System.Int32 readers = new System.Int32(0);
private System.Threading.Mutex writeLock = new System.Threading.Mutex();
private BeginMutexRead() { // Make sure we wait until write has finished writeLock.WaitOne(writeLock); // Make sure nobody else is changing the boxed read conter System.Threading.Monitor.Monitor(readers); // Add a reader readers++; if (readers == 1) { // Require mutex write lock writeLock.WaitOne(writeLock); } System.Threading.Monitor.Exit(readers); writeLock.ReleaseMutex(writeLock); }
private EndMutexRead() { // Make sure we wait until write has finished writeLock.WaitOne(writeLock); System.Threading.Monitor.Monitor(readers); readers--; if (readers == 0) { // Release mutex write lock writeLock.ReleaseMutex(writeLock); } System.Threading.Monitor.Exit(readers); writeLock.ReleaseMutex(writeLock); }
private BeginMutexWrite() { // Make sure we wait until read and write has finished writeLock.WaitOne(writeLock); }
private EndMutexWrite() { // Allow other threads to read and write writeLock.ReleaseMutex(writeLock); } --------------------------
tråd 1 laver eksklusiv lock på A tråd 2 laver eksklusiv lock på B tråd 1 forsøger at lave eksklusiv lock på B tråd 2 forsøger at lave eksklusiv lock på A og så sker der ikke ret meget
Den gængse løsning er at have en konvention om i hvilken rækkefølge locks skal udtages.
I ovenstående hvis alle tråde skal tage lock på A før de tager på B så kan der ikke opstå en deadlock.
Synes godt om
Ny brugerNybegynder
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.