之前在想,如果想让一个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中插入检查点,到达检查点之后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);} ///... }
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 (大晚上好不容易写完了还被断网——手动再见——不知道网络的稳定对于我来说有多重要么)