ich mit dem Multi-Threading-Projekt mit C++ zu tun habe und ich bezweifle über std :: MutexVermeiden Race-Bedingung mit std :: Mutex
Nehmen wir an, dass ich einen Stapel haben.
Jemand sagte, dass die Verwendung dieses Stapels Race Condition vermeiden kann. Aber ich denke, dass das Problem hier ist, dass Mutex aka gegenseitigen Ausschluss hier nur für die einzelne Funktion nicht zusammen sicherstellen. Zum Beispiel kann ich die Threads Push und Pop nennen lassen. Diese Funktion hat immer noch Probleme mit dem Race-Zustand.
Zum Beispiel:
threadsafe_stack st; //global varibale for simple
void fun1(threadsafe_stack st)
{
std::lock_guard<std::mutex> lock(m);
st.push(t);
t = st.pop();
//
}
void fun2(threadsafe_stack st)
{
std::lock_guard<std::mutex> lock(m);
T t,t2;
t = st.pop();
// Do big things
st.push(t2);
//
}
Wenn ein Thread fun1 und fun2 den gleichen Stapel (globale Variable für einfache) zu nennen. Also kann es eine Race Condition sein (?)
Ich habe nur eine Lösung, die ich denke, ist mit einer Art von atomaren Transaktion bedeutet statt direkt aufrufen push(), pop(), leer(), rufe ich sie über eine Funktion mit einem "Funktionszeiger" auf diese Funktion und mit nur einem Mutex.
Zum Beispiel:
#define PUSH 0
#define POP 1
#define EMPTY 2
changeStack(int kindOfFunction, T* input, bool* isEmpty)
{
std::lock_guard<std::mutex> lock(m);
switch(kindOfFunction){
case PUSH:
push(input);
break;
case POP:
input = pop();
break;
case EMPTY:
isEmpty = empty();
break;
}
}
Ist meine Lösung gut? Oder ich überdenke nur und die erste Lösung, die mein Freund mir gesagt hat, ist gut genug? Gibt es dafür eine andere Lösung? Die Lösung kann "atomare Transaktionen" vermeiden, wie ich es vorschlage.
Warum denken Sie, dass, wenn Sie Pop/Push von Threads aufrufen, es wird eine Race Condition geben? Thread A ruft Push- und Block-Mutex auf, Thread B ruft Pop auf und wartet, bis Mutex durch Push entsperrt wird. – ForEveR
Sie versuchen, ein Nicht-Problem zu lösen."Mutex aka wechselseitiger Ausschluss hier sorgt nur für die individuelle Funktion nicht zusammen." --- Das ist die fehlerhafte Annahme. –