如果线程变量是非局部变量需要手动去进行释放线程资源。
首先必须要有一个可以控制线程的标志位,比如变量,或者队列的结束符等。
isstop = true;
_thread->join();
delete _thread;
_thread = nullptr;
才有无锁队列concurrentqueue实现线程控制数据,关于无锁队列,源码地址:https://github.com/cameron314/concurrentqueue
//.h文件的部分定义
struct Equeue_stu{
char *data;
int x = 0;
int y = 0;
bool quit = false; //关键标志位
};
moodycamel::BlockingConcurrentQueue<Equeue_stu> _queue; //图像队列
std::thread *_thread = nullptr;
//.cpp中_thread线程实现的逻辑中,在不停的读取队列的数据,当读取的队列的数据的quit = true时,则线程结束
_thread = new std::thread([&}(){
bool bQuit = false; //此变量可不需要,
while(!bQuit){
Equeue_stu stu;
_queue.wait_dequeue(stu); //读取队列数据,如果队列中没有数据,则一直在此处等待,直到队列中有入队数据才会继续执行下面
//判断是否结束线程
if(stu.quit){
//break; //如果此处使用break跳出while循环,则变量bQuit就多此一举了,但是我的习惯是使用变量控制while循环,所以使用复杂点的方法
bQuit = true;
continue;
}
//执行体 省略
}
});
//.cpp文件实现释放逻辑
Equeue_stu stu;
stu.quit = true; //定义了一个会导致线程结束的数据结构体,
_queue.enqueue(stu); //入队,
_thread->join(); //主线程等待_thread线程结束,若_thread线程未结束,则一直在此处等待(等待线程读取队列数据读到前面的结束数据的时候,线程结束)
delete _thread; //线程结束,执行释放
_thread = nullptr;
join是为了阻塞线程,等待线程结束,如果不等待线程结束,会出现崩溃,所以释放线程资源,必须先让线程结束才可执行delete操作
局部变量的线程基本不需要考虑资源释放的问题。但是最好添加一个可控的标志来结束线程,局部变量的线程资源会在线程结束后,主线程自动销毁