Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

SemaphoreFullException

Empfohlene Antworten

Veröffentlicht

Hallo zusammen

ich habe ein Problem mit dem Multithreading meines Programms

Eine Methode die einiges an Arbeit macht wird 380mal aufgerufen. um dies zu Beschleunigen habe ich alle multithreaded wobei bis zu 100 threads gleichzeitig laufen können. das Problem ist jedoch das eine einzige kleine Stelle, wo ein Insert in eine Datenbank gemacht wird, nur 1 Thread gleichzig sein darf.

gelöst ist das Follgendermassen:



// Definition

private static Semaphore _pool;


// Initialisierung

   _pool = new Semaphore(0, 1);

   _pool.Release(1);


// Codestelle

lock (_pool) {

    _pool.WaitOne();


    // Insert


    try {

        _pool.Release(1);

    }

    catch(Exception ex ) {

         ExceptionHandling.Log(ex);

    }

}

Wenn ich den Code so laufen lasse Funktioniert das Insert, also immer nur 1 Thread an dieser Stelle

Aber bei 3-6 Threads (je nach durchlauf) passiert eine SemaphoreFullException bei der stelle _pool.Release(1);

hat jemand eine Ahnug woran das liegen könnte?

Vielen Dank im voraus

und Freundliche Grüsse

neo336

  • Autor

Ich habs am anfach ohne das lock gehabt.

Dabei ist auch der selbe fehler passiert.

Ich habe dann beim googeln gelesen das die Semaphore klasse nicht atomar ist und hab gedacht dann mach ich mal ein lock darum schaden kanns ja nicht.

Wenn sich eh nur ein Thread zur gleichen Zeit im "Insert-Bereich" aufhalten darf, reicht ein Monitor vollkommen aus, da brauchst Du normalerweise überhaupt keinen Semaphor. Ich habe so ein bisschen den Eindruck, dass Du gar nicht so genau weißt wie Monitore, Semaphoren usw. funktionieren.

Aus dem geposteten Codefragmenten kann man den Kontrollfluß nicht ablesen, da müsstest Du schon ein bisschen mehr preisgeben.

Aber versuch es doch einfach erst mal mit einem Monitor alleine.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.