关于std::thread资源释放问题

如果线程变量是非局部变量需要手动去进行释放线程资源。
首先必须要有一个可以控制线程的标志位,比如变量,或者队列的结束符等。

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操作

局部变量的线程基本不需要考虑资源释放的问题。但是最好添加一个可控的标志来结束线程,局部变量的线程资源会在线程结束后,主线程自动销毁

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

庐州李大爷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值