Nachdem ich gerade den Fehler in meinem Programm gefunden habe
( http://www.tutorials.de/c-c/368383-wie-finde-ich-den-fehler.html )
stosse ich hier auf ein viel grundsätzlicheres Problem, mit Namen "thread-safe".
Ich nutze im Programm ein paar wenige aber doch ein paar Funktionen, die nicht thread safe sind, wie z.B. memset().
Das ist kein Problem, solange ich das weiss, Mutex drumrum, fertig.
Aber woher weiss ich, was thread safe ist und was nicht?
Im Web finden sich zu 1000den Artikel, teilweise 5-10 Jahre alt, die besagen, dass eigentlich überhaupt nichts thread safe ist, nicht mal die string Klasse.
In neueren Artikeln findet man dann Hinweise, dass string jetzt doch thread safe ist, aber nicht auf jeder Plattform, teilweise sogar noch abhängig vom verwendeten Compiler.
Genauso gibt es 1000 Artikel zu alloc() und malloc() und so gut wie allen anderen C Funktionen.
In kurz, ich sehe den Wald vor lauter Bäumen nicht mehr.
Klar, wenn 2 threads sich den selben string teilen müssen, dann muss ich den Zugriff sichern, via Mutex oder so, aber wie schaut das bei internen Funktionen der Klassen aus?
Wenn ich mache:
dann muss die string Klasse dafür den Speicher reservieren und die verwendet vermutlich auch nur malloc() oder ähnliches.
Wenn also 2 oder mehr threads gleichzeitig versuchen Speicher für einen string (oder sonstwas) zu reservieren, wobei die strings in beiden threads jeweils privat sind, wann ist das thread safe?
Wenn ich mache:
dann muss die string Klasse zuerst 2 Mal Speicher reservieren und dann den ersten Speicher erweitern.
Was passiert, wenn 2 oder mehr threads das gleichzeitig machen, mit jeweils privaten strings.
Bevor wir uns aber jetzt auf die string Klasse versteifen, in meinem Problem aus dem anderen Beitrag taucht das noch viel grundsätzlicher auf.
Da hatte ich 2 threads, von denen einer eine einfache Schleife laufen hatte
Im anderen thread gab es
Wenn nun zufällig beides gleichzeitig lief (das kam alle paar Stunden mal vor) dann hat memset() die Initialisierung vom Schleifenzähler überschrieben, ich bekam also beim ersten Lauf der Schleife nicht i = 0 sondern i = undefiniert, und logisch stürzt das Ganze bei i++ ab.
Da stellt sich mir die Frage, kann ich in multithreaded Programmen nicht mal mehr private Variablen initialisieren ohne Mutex drumrum?
( http://www.tutorials.de/c-c/368383-wie-finde-ich-den-fehler.html )
stosse ich hier auf ein viel grundsätzlicheres Problem, mit Namen "thread-safe".
Ich nutze im Programm ein paar wenige aber doch ein paar Funktionen, die nicht thread safe sind, wie z.B. memset().
Das ist kein Problem, solange ich das weiss, Mutex drumrum, fertig.
Aber woher weiss ich, was thread safe ist und was nicht?
Im Web finden sich zu 1000den Artikel, teilweise 5-10 Jahre alt, die besagen, dass eigentlich überhaupt nichts thread safe ist, nicht mal die string Klasse.
In neueren Artikeln findet man dann Hinweise, dass string jetzt doch thread safe ist, aber nicht auf jeder Plattform, teilweise sogar noch abhängig vom verwendeten Compiler.
Genauso gibt es 1000 Artikel zu alloc() und malloc() und so gut wie allen anderen C Funktionen.
In kurz, ich sehe den Wald vor lauter Bäumen nicht mehr.
Klar, wenn 2 threads sich den selben string teilen müssen, dann muss ich den Zugriff sichern, via Mutex oder so, aber wie schaut das bei internen Funktionen der Klassen aus?
Wenn ich mache:
Code:
string MyString = "abcde";
dann muss die string Klasse dafür den Speicher reservieren und die verwendet vermutlich auch nur malloc() oder ähnliches.
Wenn also 2 oder mehr threads gleichzeitig versuchen Speicher für einen string (oder sonstwas) zu reservieren, wobei die strings in beiden threads jeweils privat sind, wann ist das thread safe?
Wenn ich mache:
Code:
string MyString = "abcde";
string MyString2 = "fghij";
MyString = MyString + MyString2;
dann muss die string Klasse zuerst 2 Mal Speicher reservieren und dann den ersten Speicher erweitern.
Was passiert, wenn 2 oder mehr threads das gleichzeitig machen, mit jeweils privaten strings.
Bevor wir uns aber jetzt auf die string Klasse versteifen, in meinem Problem aus dem anderen Beitrag taucht das noch viel grundsätzlicher auf.
Da hatte ich 2 threads, von denen einer eine einfache Schleife laufen hatte
Code:
for(UINT i = 0; i < 1000; i++)
...
Im anderen thread gab es
Code:
memset(...);
Wenn nun zufällig beides gleichzeitig lief (das kam alle paar Stunden mal vor) dann hat memset() die Initialisierung vom Schleifenzähler überschrieben, ich bekam also beim ersten Lauf der Schleife nicht i = 0 sondern i = undefiniert, und logisch stürzt das Ganze bei i++ ab.
Da stellt sich mir die Frage, kann ich in multithreaded Programmen nicht mal mehr private Variablen initialisieren ohne Mutex drumrum?
Zuletzt bearbeitet: