neo336 Geschrieben 8. Mai 2013 Geschrieben 8. Mai 2013 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
realgun Geschrieben 8. Mai 2013 Geschrieben 8. Mai 2013 Wieso vermischst Du einen Monitor mit einem Semaphor???
neo336 Geschrieben 8. Mai 2013 Autor Geschrieben 8. Mai 2013 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.
realgun Geschrieben 9. Mai 2013 Geschrieben 9. Mai 2013 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.
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden