Hallo,
ich spiele grade mit dem Datenaustausch zwischen threads rum, angenommen ich habe X Threads und ich erstelle ein Semaphore,
wenn ich meinen kritischen Code innerhalb von
sema.Semaphore.WaitOne();
// code
sema.Semaphore.Release();
bin ich auf der sicheren seite?
kann ich unterschieden zwischen "lesen" und "schreiben", es können ja mehrere threads auf die selbe variabel lesend zugreifen.
_best,
T
Hallo,
in der Literatur wird normalerweise vorgeschlagen das Szenario 1 darf schreiben, n dürfen lesen so zu lösen:
for(int i = 0; i < n; i++)
P(SEMAPHOR);
// Kritischer Code
for(int i = 0; i < n; i++)
V(SEMAPHOR);
Das heißt du definierst zu beginn einen Maximalwert für die Lesenden Prozesse bzw. Threads und lässt die schreibende Routine alle diese Slots konsumieren bevor sie etwas tut.
Bei C# löst du das Problem noch einfacher mit WaitAll. Wenn du die Anzahl der lesenden Threads vorher nicht weißt und unbedingt möchtest, dass theoretisch alle gleichzeitig lesen können müsstest du auf etwas anderes ausweichen als Semaphore. Aber das ist meiner Erfahrung nach nie nötig.
As a man thinketh in his heart, so he is.
Hallo,
ich spiele grade mit dem Datenaustausch zwischen threads rum, angenommen ich habe X Threads und ich erstelle ein Semaphore,
wenn ich meinen kritischen Code innerhalb von
sema.Semaphore.WaitOne(); // code sema.Semaphore.Release();
bin ich auf der sicheren seite?
kann ich unterschieden zwischen "lesen" und "schreiben", es können ja mehrere threads auf die selbe variabel lesend zugreifen.
Nein, eine Unterscheidung zwischen Threads ist nicht möglich. Semaphore spezifiert nur wieviele Threads den Codeabschnitt betreten dürfen, nicht welche das sind.
Das wäre auch unsinnig, du programmierst den Code der Threads schließlich selbst.
Alles weitere, siehe:
“Ene mene mu und raus bist Du!”
Hallo zusammen,
eine andere, sehr komfortable Möglichkeit, gleichzeitige Lese und Schreibzugriffe zu managen sind Transaktionen. Viele verbinden das automatisch mit Datenbanken. Dem ist nicht so. System.Transactions lässt sich mit beliebigen Daten einsetzen.
Hallo,
es ist aber möglich bestimmte Threads mit dem Priority-Property zu bevorzugen.
As a man thinketh in his heart, so he is.
Hallo,
vielen Dank für den Hinweis auf System.Transactions, ich werde mir diese mal genauer angucken. Gibt es auch Dateistrukturen die Out-Of-The-Box darauf optimiert sind, dass man sie von allen Seiten beschreiben und lesen kann? (welcher client ist in welchem channel)
in der aktuellen ix wird auf Seite 53 der ConcurrentBag erwähnt, kennt ihr da was?
Das die Ursprungproblematik kommt daher, dass ich ein kleinen Chatserver am schreiben bin, jeder Client wird in einem Threadpool verwaltet. Schon diese Lösung gefällt mir nicht wirklich, da die Threads sich heiß laufen. Tasks kann ich jedoch auch nicht verwenden, da diese ja Endlos sind. dann die Problematik, dass das OS an gleichzeitigen Socketverbindungen stark begrenzt ist, Asynchrone IOs erscheinen mir auch keine gute Lösung .....