Threadsicherheit (mit OpenMP)
-
Die Fragen kann man sich doch alle selber beantworten, wenn man einfach mal ein Beispiel Schritt für Schritt durchgeht.
-
Solange man nichts genaueres über die "MyObj" Klasse und deren Memberfunktionen weiss, kann man nur sagen: du musst bei jedem Zugriff auf MyObj (egal ob "const" oder nicht "const") einen unique-lock auf eine Mutex holen!
Sollten gewisse Voraussetzungen erfüllt sein, dann reicht es, wenn du beim Lesen einen shared-lock holst. Locken musst du aber auf jeden Fall auch beim Lesen!
Also nochmal ganz klar: du musst bei 1, 2 UND 3 den Zugriff synchronisieren!
Ja, auch bei 1!
-
mal ehrlich schrieb:
Die Fragen kann man sich doch alle selber beantworten, wenn man einfach mal ein Beispiel Schritt für Schritt durchgeht.
So ein Schwachsinn!
Dass viele Leute so wie du denken, gleichzeitig aber leider zu wenig Ahnung von Threading haben (die ich dir auch abspreche, sonst wüsstest du dass das Thema lange nicht so einfach ist), ist der Grund, warum so irre viele Leute andauernd Threading-bezogene Fehler machen.
Bla-Blubb.
Viel Spass beim schlechte Programme schreiben noch weiterhin.
-
Ich würd mal gern wissen, wie so ein Konflikt überhaupt auftreten kann? Wenn 2 Threads aber nur wechselwirkend (da nur 1 Prozessor!) auf diesselbe Variable schreiben wollen? Entweder schreibt der eine Thread oder der andere. Aufm Stack passt doch nur ein Pointer.
-
@xBlackKnightx:
Wie kommst du auf die Idee dass nur ein Thread gleichzeitig laufen würde??? Ich hab nen Quad-Core (auch "nur 1 Prozessor"), da laufen hübsch 4 Threads gleichzeitig.Mal ganz davon abgesehen, dass es selbst bei "nur ein Prozessor und auch nur ein Core (und auch kein Hyper-Threading etc.)" Probleme geben kann.
-
hustbaer schrieb:
mal ehrlich schrieb:
Die Fragen kann man sich doch alle selber beantworten, wenn man einfach mal ein Beispiel Schritt für Schritt durchgeht.
So ein Schwachsinn!
Dass viele Leute so wie du denken, gleichzeitig aber leider zu wenig Ahnung von Threading haben (die ich dir auch abspreche, sonst wüsstest du dass das Thema lange nicht so einfach ist), ist der Grund, warum so irre viele Leute andauernd Threading-bezogene Fehler machen.
Bla-Blubb.
Viel Spass beim schlechte Programme schreiben noch weiterhin.
Dann unterstell ich dir jetzt mal, dass du dumm bist, wenn das hier schon kompliziert für dich ist. Jetzt sag mir doch mal bitte bei welchem dieser 3 einfachen Beispiele man nicht selber drauf kommen kann, was schief gehen kann, wenn er es genauer beschrieben hätte, so dass man es Schritt für Schritt durchgehen kann? Das was du hier machst sie doch nur dummes raten, weil die Beschreibung viel zu ungenau ist.
-
hustbaer schrieb:
@xBlackKnightx:
Wie kommst du auf die Idee dass nur ein Thread gleichzeitig laufen würde??? Ich hab nen Quad-Core (auch "nur 1 Prozessor"), da laufen hübsch 4 Threads gleichzeitig.Mal ganz davon abgesehen, dass es selbst bei "nur ein Prozessor und auch nur ein Core (und auch kein Hyper-Threading etc.)" Probleme geben kann.
Hmm also die Prozesse werden im Prozessor verteilt? Würde ein Programm auch schneller laufen wenn man Skripte, Funktionen in Threads verteilt? Also bei 1-Prozessor PC
-
ThreadSafety schrieb:
1.) Initialisierung (oder auch Zuweisung) einer gemeinsam genutzten Variablen
MyObj global; { // start paralleler Block MyObj aObj(global); // bzw. MyObj* pObj = new MyObj(global); } // ende paralleler BlockDu erstellst doch fuer jeden Thread eine eigene Kopie von global. Sollte der MyObj-Ctor keine Schreibzugriffe irgendeiner Art (siehe Fall 2) enthalten, muesste das okay sein.
Aber wenn du im parallelen Block auf global zugreifst, muss dieser Zugriff geschuetzt werden!2.) Aufruf einer Methode einer gemeinsam genutzten Variablen
class MyObj { //... // Fall a) void DoSomething() const; // Fall b) void DoSomething(); } MyObj global; { // start paralleler Block global.DoSomething(); } // ende paralleler Blockdie const-Methode musst du nicht schuetzen, wenn diese wirklcih keine Zustaende schreibt. Aber wenn MyObj mutable-Variablen hat, DoSomething eine globale Funktion aufruft/auf globale Variablen zugreift, Dateizugriffe hat etc. etc. musst du auch hier synchronisieren.
Ebenfalls synchronisieren musst du, wenn es einen anderen Thread gibt, der gleichzeitig ausgefuehrt wird und dieser irgendwie global veraendert.
Die nicht-const-Methode - welche vermutlich irgend eine Schreib-Operation enthaelt - muss sowieso synchronisiert werden.3.) Aufruf einer Funktion, die eine gemeinsam genutzte Variable übergeben bekommt
void DoSomethingWith(const MyObj&) { // do something with MyObj } MyObj global; { // start paralleler Block DoSomethingWith(global); } // ende paralleler BlockWenn DoSomethingWith irgend einen Status schreibt (s.o.) musst du synchronisieren.
-
Danke für die Antworten!
Ich gebe zu, dass meine Beispiele für konkrete Antworten eigentlich zu allgemein sind. Die Antworten haben trotzdem geholfen, dass mir die Sache ein wenig klarer geworden ist.
-
mal ehrlich schrieb:
hustbaer schrieb:
mal ehrlich schrieb:
Die Fragen kann man sich doch alle selber beantworten, wenn man einfach mal ein Beispiel Schritt für Schritt durchgeht.
So ein Schwachsinn!
Dass viele Leute so wie du denken, gleichzeitig aber leider zu wenig Ahnung von Threading haben (die ich dir auch abspreche, sonst wüsstest du dass das Thema lange nicht so einfach ist), ist der Grund, warum so irre viele Leute andauernd Threading-bezogene Fehler machen.
Bla-Blubb.
Viel Spass beim schlechte Programme schreiben noch weiterhin.
Dann unterstell ich dir jetzt mal, dass du dumm bist, wenn das hier schon kompliziert für dich ist. Jetzt sag mir doch mal bitte bei welchem dieser 3 einfachen Beispiele man nicht selber drauf kommen kann, was schief gehen kann, wenn er es genauer beschrieben hätte, so dass man es Schritt für Schritt durchgehen kann? Das was du hier machst sie doch nur dummes raten, weil die Beschreibung viel zu ungenau ist.
Aha.
-
xBlackKnightx schrieb:
hustbaer schrieb:
@xBlackKnightx:
Wie kommst du auf die Idee dass nur ein Thread gleichzeitig laufen würde??? Ich hab nen Quad-Core (auch "nur 1 Prozessor"), da laufen hübsch 4 Threads gleichzeitig.Mal ganz davon abgesehen, dass es selbst bei "nur ein Prozessor und auch nur ein Core (und auch kein Hyper-Threading etc.)" Probleme geben kann.
Hmm also die Prozesse werden im Prozessor verteilt? Würde ein Programm auch schneller laufen wenn man Skripte, Funktionen in Threads verteilt? Also bei 1-Prozessor PC
Was hat denn schneller laufen mit Korrektheit und Thread-Safety zu tun?
Und was meinst du jetzt mit "1-Prozessor PC"? Single-Core, oder Single-CPU? Auf Single-CPU, Multi-Core Systemen bringt das was, ja.
Auf Single-CPU, Single-Core Systemen bringt es u.U. auch was, z.B. wenn die Skripte oder Funktionen IO machen, und dadurch auf etwas warten müssen, während die CPU Däumchen dreht.
Bezüglich deiner "bloss eine Variable" Frage, lies mal das, da werden einige der Probleme angesprochen:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1680.pdf