Laden...

semaphore

Erstellt von freak131 vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.534 Views
F
freak131 Themenstarter:in
101 Beiträge seit 2008
vor 13 Jahren
semaphore

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

799 Beiträge seit 2007
vor 13 Jahren

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.

  • Jun Fan
    Es gibt nichts Gutes, außer man tut es.
  • Erich Kästner
    Krawutzi-Kaputzi
  • Kasperl
S
72 Beiträge seit 2006
vor 13 Jahren

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:

Die Klasse Semaphore und Synchronisationsblöcke

“Ene mene mu und raus bist Du!”

3.728 Beiträge seit 2005
vor 13 Jahren
Transaktionen

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.

799 Beiträge seit 2007
vor 13 Jahren

Hallo,

es ist aber möglich bestimmte Threads mit dem Priority-Property zu bevorzugen.

As a man thinketh in his heart, so he is.

  • Jun Fan
    Es gibt nichts Gutes, außer man tut es.
  • Erich Kästner
    Krawutzi-Kaputzi
  • Kasperl
F
freak131 Themenstarter:in
101 Beiträge seit 2008
vor 13 Jahren

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