2016-09-01 1 views
0

Ich habe ein einfaches Array von Zeichenfolge, und ich versuche, auf sie zuzugreifen und durch verschiedene Threads zu schreiben. Infact Ich habe die Größe char[10] jeder, da ich immer die Länge jeder Zeichenfolge < 500 haben werde. Ich weiß, wenn ich darauf zugreifen würde, ohne Änderung zwischen, von verschiedenen Threads, wird es kein Problem damit sein.Zugriff auf und Schreiben in Array aus verschiedenen Threads

Das Problem tritt auf, wenn ich zu diesen Strings aus verschiedenen Threads schreibe und wenn ich eine Zeichenfolge bei arr[2] aus verschiedenen Threads ändern, die Ergebnisse sind irgendwie unvorhersehbar, da Threads möglicherweise voreinander laufen und die Ausgabe ist unvorhersehbar und oft mischen Sie diese 2 Saiten. Dies liegt daran, dass die Strings aus mehreren Zeichen bestehen und verschiedene Threads gleichzeitig auf verschiedene Zeichen desselben Strings zugreifen und so eine Mischung von Strings erzeugen.

Ich habe in mutexes und atomic Variablen untersucht. Mutexe müssen die Variable sperren und dann die Zeichenfolge schreiben und dann entsperren. Wäre dies ein guter Ansatz zur Lösung des Problems? Ich versuchte den atomaren Ansatz zu verstehen, aber es ging mir direkt durch den Kopf:/

Eine andere Frage wäre, wenn das Array aus echten atomaren Operationen wie ein Array von Bool zusammengesetzt wäre, wo ich nur wahr oder falsch setzen müsste Zu welchen Indizes würde dieses Problem auch dort auftreten? Da es keine Mehrfachzeichen gibt, sollte das Problem nicht da sein, oder?

+0

Müssen alle Threads in denselben globalen String schreiben? Können Sie die gesamte Verarbeitung durchführen und dann am Ende eine Zeichenfolge zurückgeben und all diese aus allen Threads kombinieren? – NathanOliver

+0

@NathanOliver Das String-Array ist global, da es für alle Threads zugänglich sein muss. Aber ja, ich kann eine direkte Zeichenfolge nach der Verarbeitung zurückgeben. Würde das garantieren, dass Strings nicht schlecht geformt sind? –

+0

"Nicht mehrere Zeichen -> Kein Problem" ist eine gefährliche falsche Schlussfolgerung. Es ist viel komplizierter als das, es gibt auch Caching/Sichtbarkeitsprobleme. – alain

Antwort

2

Meine persönliche Proposition wäre: Haben Sie einen Mutex für jede Zeichenfolge und Threads die Mutex für die Zeichenfolge, die sie schreiben möchten, bevor sie dies tun.

Verglichen mit einem globalen Mutex für alle Zeichenfolgen, ermöglicht dies den parallelen Zugriff auf die verschiedenen Zeichenfolgen, so gute Chancen, dass Sie eine bessere Leistung erhalten.

Beachten Sie jedoch, dass mehrere Mutexe immer das Risiko von toten Sperren mit sich bringen, wenn Sie sie nicht korrekt behandeln. Eine Möglichkeit, dies zu vermeiden, wäre, jeden Thread zu implementieren, der nicht mehr als einen Mutex gleichzeitig hält. Dann bist du sofort sicher.

Wenn Sie mehr als einen Mutex in einem Thread benötigen, dann ist eine einfache Strategie, um Dead Locks zu vermeiden, immer der Mutex in der gleichen Reihenfolge in jedem Thread.

+0

Danke, könnten Sie ein einfaches Beispiel erzählen, wie mehrere Mutexe ein Problem sein können - 'mehrere Mutexe bringen immer das Risiko von toten Sperren, wenn Sie sie nicht richtig behandeln. Wie würde Deadlock hier auftreten. –

+2

@hg_git Stellen Sie sich zwei Threads, T1 und T2, und zwei Mutexe M1 und M2 vor. Beide Threads wollen beide Mutexe aufnehmen. T1 läuft, kann M1 sperren, wird aber unterbrochen. T2 läuft, schafft es, M2 zu sperren, kann aber M1 nicht bekommen, weil es bereits gesperrt ist. Jetzt läuft T1 wieder, kann M2 nicht mehr bekommen, weil T2 es gesperrt hat. Keiner der beiden Threads läuft mehr ... – Aconcagua

+2

@hg_git Problem hier ist, dass die Mutexe in anderer Reihenfolge erworben werden. Wenn sowohl T1 als auch T2 versucht hätten, zuerst M1 zu sperren, wäre dies nicht eingetreten. – Aconcagua

Verwandte Themen