我有一个日志类,该类包含一个定义为:ofstream logfile
的流和一个互斥锁,以确保每次只有一个线程写入该文件(该程序是多线程的)。
该类定义为:
#define LOG_NAME "log.txt"
using namespace std;
class Log
{
private:
pthread_mutex_t mutex_write;
ofstream logfile;
public:
Log();
~Log();
void Write (string txt);
};
构造函数是:
Log::Log()
{
pthread_mutex_init (&mutex_write,NULL);
pthread_mutex_lock (&mutex_write);
logfile.open(LOG_NAME, ios::out | ios::trunc);
logfile << "Created log file named " << LOG_NAME << endl;
pthread_mutex_unlock (&mutex_write);
}
析构函数是:
Log::~Log()
{
logfile << "Closing log file" << endl;
pthread_mutex_lock (&mutex_write);
logfile.close();
pthread_mutex_unlock (&mutex_write);
pthread_mutex_destroy (&mutex_write);
}
和
void Log::Write (string txt)
{
pthread_mutex_lock (&mutex_write);
logfile << txt << endl;
pthread_mutex_unlock (&mutex_write);
}
在某些调用析构函数的时候,它无法执行第logfile.close();
行,因为它表示它会出现分段错误,或者显示消息:
*** glibc detected *** corrupted double-linked list: 0x0000000000513eb0 ***
Abort
这种情况不会一直发生,似乎是随机发生的,大约有10%的时间。该程序是多线程的(在linux下)。
修改
用法示例:(其中log
是指向Log
类)对象的指针
stringstream str;
str.str("");
str << "Ant " << i << " was created at place: (" << x << "," << y << ")";
log->Write (str.str());
或者,如果字符串仅包含已知文本
log->Write ("Created board entity");
答案 0 :(得分:3)
不是100%肯定,但它可能与代码中任何地方的内存损坏有关。 要深入挖掘这个问题,请尝试在Valgrind下运行程序或调查核心转储(确保它已启用 - AFAIR ulimit -c unlimited)。
答案 1 :(得分:0)
问题是我们在检查所有线程是否已完成时遇到问题。我们修好了,现在工作正常。 问题可能是因为其他线程试图访问已关闭的文件,有时会尝试访问被杀死的实体。