我有一个日志类,该类包含一个stream定义为: ofstream logfile和一个互斥锁,以确保每次只有一个线程写入文件(该程序是multithreading)。 这个类被定义为:
#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%的时间。 该程序是multithreading(在Linux下)。
编辑:使用示例:(其中log是指向Log类对象的指针)
stringstream str; str.str(""); str << "Ant " << i << " was created at place: (" << x << "," << y << ")"; log->Write (str.str());
或者,如果string只包含知道文本
log->Write ("Created board entity");
不是100%肯定的,但它可能与代码中任何地方的内存损坏有关。 要深入挖掘这个问题,请尝试在Valgrind下运行你的程序或者调查核心转储(确保它启用 – AFAIR ulimit -c unlimited)。
问题是我们在检查所有线程都已经完成时遇到问题。 我们已经修复了这个,现在它工作正常。 这个问题可能是因为其他线程试图访问一个关闭的文件,有时试图访问一个被杀死的实体。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。