Ich versuche, einen Deadlock aus einem Programm zu entfernen. Das Problem ist, dass das Programm mich immer wieder abbricht. Der Punkt ist, Daten in eine Datei zu schreiben. Wenn jedoch ein Deadlock auftritt, sollte der Thread warten und später fortfahren anstatt abzubrechen.C++ Threads Deadlock Mutex Sperre abgebrochen
#include <iostream>
#include <unistd.h>
#include <fstream>
#include <vector>
#include <thread>
#include <mutex>
#include <exception>
#include <condition_variable>
using namespace std;
std::mutex mtx;
ofstream myfile;
condition_variable cv;
void lock()
{
mtx.lock();
}
void unlock()
{
mtx.unlock();
}
void writeToFile(int threadNumber){
myfile << "[";
for(int j =1; j <= 10; j++){
int num = j * threadNumber;
string line = std::to_string(num) + " ";
myfile << line;
}
myfile << "]";
//mtx.unlock();
}
void threadFunction(int threadNumber)
{
// int x = 0;
// int y = 0;
try{
lock();
if (threadNumber % 2 == 0)
sleep(rand() % 4 + 1);
writeToFile(threadNumber);
throw exception();
unlock();
}
catch(...){
cout << "Something went wrong!" << endl;
throw exception();
}
}
int main (int argc, char const *argv[]) {
myfile.open ("mutex.txt");
std::set_terminate([](){
std::cout << "Unhandled exception\n";
// Here I want to fix the deadlock if something goes wrong. But I keep getting Abroted
});
int len;
cout << "Enter Number of threads : ";
cin >> len;
std::thread t[len + 1];
for(int i =1; i <= len;i++){
t[i] = std::thread(threadFunction, i);
cout << "Created Thread : " <<t[i].get_id()<<endl;
}
for(int i =1; i <= len;i++){
t[i].join();
}
myfile.close();
return 0;
}
Ausgabe
Enter Number of threads : 5
Created Thread : 1992414288
Created Thread : 1982854224
Created Thread : 1974465616
Created Thread : 1966077008
Created Thread : 1957688400
Something went wrong!
Unhandled exception
Aborted
Wie kann ich die abgebrochenen vermeiden und den Faden warten lassen.
Update: Enthalten alle relevanten Code ...
Wenn ein Deadlock auftritt, werden * alle * betroffenen Threads blockiert, die auf einander warten, und * keine * von ihnen können * per Definition * weitermachen. Deine Frage ergibt keinen Sinn. Die Lösung für eine Deadlock-Situation besteht darin, die Sperren immer in der gleichen Reihenfolge zu erfassen. – EJP
Erhalten Sie keine große phat Warnung auf diesem 'mtx.unlock()' sagt Ihnen, "Code wird nie ausgeführt werden." ? Wenn nicht, zeigen Sie Ihre Compiler-Warnungen an. – WhozCraig
Nein, ich bekomme keine Warnung –