【发布时间】:2017-09-16 10:12:32
【问题描述】:
我正在尝试从程序中消除死锁。问题是程序一直让我中止。重点是将数据写入文件。但是当发生死锁时,线程应该等待并稍后继续,而不是中止。
#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;
}
输出
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
如何避免中止,让线程等待。
更新:包含所有相关代码...
【问题讨论】:
-
发生死锁时,所有个相关线程都被阻塞等待,没有一个可以继续,定义。你的问题没有意义。任何死锁情况的解决方案是始终以相同的顺序获取锁。
-
mtx.unlock()告诉您“代码将永远不会被执行”,您不会收到一个很大的警告。 ?如果没有,请打开编译器警告。 -
不,我没有收到警告
-
@johnS 编译时打开
-Wall标志。 -
我做了,但没有警告
标签: c++ multithreading locking mutex deadlock