Forum: PC-Programmierung Semaphore oder Mutex


von Max (Gast)


Lesenswert?

Hallo miteinander!

Ich stehe grade vor folgendem Problem:
Ich habe eine verkette Liste, auf die mehrere Threads zugreifen.
Und als nächstes will ich Elemente draus entfernen oder neue einfügen.

Also dachte ich mir: klare Sache Mutex. Und dann hab ich ein wenig 
gelesen und jetzt bin ich verwirrt: sind Semaphoren hier vielleicht doch 
die bessere Wahl?

Ich habe drei Konsumenten (greifen lesend auf die Listen zu) und einen 
Steuerthread (das ist der, der die Elemente rausnimmt).

Setze ich jetzt die Semaphoren auf 3 und lasse jeden Konsumententhread 
einen Semaphor zum Arbeiten haben, warte dann im Steuerthread darauf, 
dass die Konsumenten die Semaphore zurückgeben und wenn der Steuerthread 
alle drei Semaphore hat kann er gefahrlos an der Liste operieren?

Oder ist ein Mutex vor jedem Listenzugriff der bessere Ansatz?

Meine Konsumententhreads machen übringens die Kommunikation mit dem 
Netzwerk, sollten deswegen also nicht zulange/zuhäufig ohne Listengriff 
sein.

Oder gibts noch eine andere Lösung die in dem Fall besser geeignet wäre?

Gruß
Max

von Oliver (Gast)


Lesenswert?

Wenn du hast, nimm einen "Schreibmutex". Wie genau sich das bei deinem 
System nennt, musst du selber rausfinden. "Schreibmutexe" erlauben 
beliebig viele  Lesezugriffe gleichzeitig, aber nur einen 
Schreibzugriff.

Oliver

von Max (Gast)


Lesenswert?

Danke für den Hinweis, aber ich glaube im Zusammenspiel mit verketten 
Listen bringt mir das nicht so viel. Ich befürchte, dass die lesenden 
Threads "abgehängt" werden, wenn ich ein Element entferne.

von Peter II (Gast)


Lesenswert?

Linux oder Windows?

Bei Windows gibt es auch noch CriticalSection. Das ist in einem Prozess 
etwas schnell weil es nicht immer über den Kernel geht.

von Max (Gast)


Lesenswert?

Linux

von Oliver (Gast)


Lesenswert?

Max schrieb:
> Ich befürchte, dass die lesenden
> Threads "abgehängt" werden, wenn ich ein Element entferne.

Befürchten ist fast so wie glauben: Beides ist beim Multithreading eher 
fehl am Platz. Da sollte man sich schon sicher sein.

Mit Schreibmutex bekommst du das selbe Verhalten wie mit deiner "3 
Semaphoren" Variante. Du sparst dir damit den Verwaltungsaufwand für die 
Semaphoren.

Ob aber deine Listen so programmiert sind, daß mehrere Threads da lesend 
gleichzeitig drin unterwegs sein dürfen, kannst du nur selber 
beantworten. Solange die Konsumententhreads nur lesen, und nur der 
Schreibthread tatsächlich Daten verändert, sollte das ja eigentlich kein 
Problem sein.

Wenn das nicht gegeben ist, oder du es schlicht nicht genau weißt, nimm 
eine normale Mutex. Dann kann immer nur ein Thread gleichzeitig 
zugreifen, mit allen Konsequenzen bezüglich des Timings. Glauben, 
vermuten, und hoffen geht bei Multithreading schief. Nicht sofort, aber 
immer.

Oliver

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.