如何解决提升多线程异常
的程序#include <stdio.h>
#include <boost/thread/shared_mutex.hpp>
#include <boost/thread.hpp>
class MutexClass
{
private:
/* data */
boost::shared_mutex m_mutex;
bool running; //The flag program should stop
public:
MutexClass(/* args */);
~MutexClass();
void doSomeThing();
};
MutexClass::MutexClass(/* args */)
{
running = true;
printf("MutexClass()\n");
}
MutexClass::~MutexClass()
{
printf("~MutexClass\n");
boost::unique_lock<boost::shared_mutex> lock(m_mutex);
running = false;
}
void MutexClass::doSomeThing() {
printf("doSomeThing\n"); //In fact,here is a callback or loop
boost::shared_lock<boost::shared_mutex> lock(m_mutex); //(1)Exception here
if(running){
printf("still running!\n");
}
}
void doSomeThing(MutexClass* mtx) {
sleep(3);
mtx->doSomeThing();
}
void destroy(MutexClass* mtx) {
sleep(2);
delete mtx;
mtx = NULL;
}
int main(int argc,char* argv[])
{
MutexClass* mtx = new MutexClass();
boost::thread thrd1(&doSomeThing,mtx);
boost::thread thrd2(&destroy,mtx);
thrd1.join();
thrd2.join();
sleep(5);
return 0;
}
当我用
运行这个文件时g++ main.cpp -lboost_system -lboost_thread -g -o main && ./main
MutexClass()
~MutexClass
doSomeThing
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::lock_error> >'
what(): boost: mutex lock Failed in pthread_mutex_lock: Invalid argument
Aborted
我知道它在第 33 行(函数中的注释行)崩溃
void MutexClass::doSomeThing() {
printf("doSomeThing\n"); //In fact,here is a callback or loop
boost::shared_lock<boost::shared_mutex> lock(m_mutex); //Exception here
if(running){
printf("still running!\n");
}
}
Env:Boost 版本为 1.54
我的问题是:程序是multiple-read/single-write
,如果 MutexClass 已经运行析构函数,我如何在不同线程中运行 doSomeThing 时避免这种情况。
并且只能添加try/catch块?
谢谢!
解决方法
它可以通过多种方式完成。这里的主要目标不是 set
您的对象,直到使用它的所有例程都死了。其中一种方法是使用 delete
将对象传递给线程。
看看我在这里做了什么来使这段代码工作。我已经用 !!!
评论了重大变化shared_ptr
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。