Ich habe ein C++ - Programm, das einige globale Variablen deklariert. Danach teilt es sich in mehrere Threads auf, um mehrere Aufgaben zu erledigen. Diese Threads lesen und schreiben einige dieser globalen Variablen.C++ Multithreading mit globalen Variablen verstehen
Wird es eine App-Absturz, wenn zwei Threads Lesen die gleiche Variable sind? Oder wird es nur dann einen App-Crash geben, wenn ein Thread an eine Variable schreibt, die ein anderer Thread gerade liest?
Wenn also die Antwort auf meine zweite Frage ja wäre, würde das folgende Codebeispiel dieses Problem lösen?
#include <string>
#include <thread>
#include <mutex>
using namespace std;
mutex m;
string var = "foo";
// function to provide read and write access
// "protected" with mutex
string test(string value = "")
{
m.lock();
if (value == "")
{
m.unlock();
return var;
}
else
{
var = value;
m.unlock();
return "";
}
}
void thread1()
{
// use global variable local
string localVar = test();
}
void thread2()
{
// overwrite global variable
test("bar");
}
void thread3()
{
// use global variable local
string localVar = test();
}
int main()
{
thread t1(thread1);
thread t2(thread2);
thread t3(thread3);
t1.join();
t2.join();
t3.join();
return 0;
}
weiterhin gilt: ist dieser Teil
// ...
if (value == "")
{
m.unlock();
return var;
}
// ...
auch thread retten?
Und meine letzte Frage: mein Programm verwendet derzeit nur einen Mutex, um zu verhindern, dass zwei Threads (die gleiche Funktion!) Gleichzeitig ausgeführt werden. Ich verwende keine Mutexe für meine globalen Variablen. Könnte es sein, dass diese "Situation" einen App-Absturz (Modul: "ntdll.dll") mit dem Ausnahmecode 0xc0000005 verursachen kann?
Vielen Dank im Voraus!
BTW, gebrauchte _scoped Schlösser_ bitte! –