neo336 Geschrieben 8. Mai 2013 Teilen 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
realgun Geschrieben 8. Mai 2013 Teilen Geschrieben 8. Mai 2013 Wieso vermischst Du einen Monitor mit einem Semaphor??? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
neo336 Geschrieben 8. Mai 2013 Autor Teilen 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
realgun Geschrieben 9. Mai 2013 Teilen 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.