[20160215] 停止std::thread/try-catch-?异常处理的

之前在想,如果想让一个std::thread对象停止运行,那么应该如何操作呢?

很自然的想到这这种方式:

std::thread* proc=new std::thread(func);
//...
delete proc;

显式的删除对象,这样应该会被终止吧(...)

然而程序运行到delete处就直接terminate了. 显然还是thread的析构函数中joinable()返回了true,std::terminate()被调用.

但是如果一定要调用join()或者detach()方法的话,虽然能够避免无情的terminate,但是线程却变得缺乏了含义.

std::thread* proc=new std::thread(func);
proc->detach();
delete proc;

原本含义当然是想立刻终止,然而经过测试,发现func中的对象都没有被释放... 也就是说虽然delete proc执行成功,但是func还在运行。至于proc所指向的内存是否释放,当前还无从得知.

所以目前打算使用这种方式进行操作,手动在func中插入检查点,到达检查点之后func自行检查flag,如果flag被置为true则终止自己。

inline bool isover(bool* p)
{
    return *p;
}
inline void setret(int ret,int* p)
{
    *p=ret;
}
void func(bool* flag,int* retp)
{
    ///...
    if(isover(flag))
    {
        setret(1,retp);
        return;
    }
    ///...
}
或者用宏写(感觉立正一些)

#define IF_ISOVER if(*flag)
#define RETURN_INT(x) *retp=x;return;
void func(bool* flag,int* retp)
{
    ///...
    IF_ISOVER{RETURN_INT(1);}
    ///...
}

据说在C++17里面异步线程被加入到新标准。没准到时候的代码是这样的(以下纯属瞎想)

auto mproc=new std::MutableThread(func);
if(mproc->stop()==std::MutableThread::ExecStatus::OK)
{
    cout<<"Thread is stopped."<<endl;
}
else
{
    cout<<"Thread can not be stopped."<<endl;
}
delete mproc;


------------------------------------------------------------------------

对C++异常处理的一些思考

C++同C不一样的地方有很多,其中之一就是异常处理。在C时代错误通常伴随着<0的返回代码和NULL空指针,到了C++时代,异常出现在程序之中。但是,正如该词汇本身的含义一样,异常,一定意味着有什么不对劲的事情发生了。因此,这个错误要么现在处理,要么就重新抛出,直到任何层次都挽救不了的时候招呼terminate结束一切。

可是C++没有Java那样的finally关键字,发生异常时无法保证资源能够释放 = =

而且,当整个空间出现一个以上异常时,terminate就会被调用。也就是说,异常与多线程似乎是水火不容的>_<


先写到这儿吧,晚安啦w (大晚上好不容易写完了还被断网——手动再见——不知道网络的稳定对于我来说有多重要么)


你可能感兴趣的:(多线程,C++,异常处理)