C++标准线程库实现优雅退出的方式

目录

1.通过设置共享退出标记

2.使用std::jthread创建线程

3.定义消息类型的方式

4.注意事项


1.通过设置共享退出标记

        定义一个退出变量bool stop = false; 表示线程是否应该停止。在主线程中设置标记stop=true,然后join一直等待,然后线程循环检测到stop是否为true,为true则表示线程该退出了。示例代码如下:

IThread.h

#ifndef  _I_THREAD_H_
#define  _I_THREAD_H_
#include "LinkGlobal.h"
#include <Thread>
#include <memory>

LINK_CORE_NAMESPACE_BEGIN

class IThread
{
public:
	explicit IThread();
	virtual ~IThread() = default;

public:
	void start();
	void join();

protected:
	virtual void run() = 0;

private:
	std::unique_ptr<std::thread> m_thread;
	bool m_bStarted;
};

LINK_CORE_NAMESPACE_END

#endif

IThread.cpp

#include "IThread.h"

LINK_CORE_NAMESPACE_BEGIN

IThread::IThread()
	:m_bStarted(false)
	, m_thread(nullptr)
{

}

void IThread::start()
{
	if (m_bStarted) {
		join();
		return;
	}

	m_thread.reset(new std::thread(&IThread::run, this));
	m_bStarted = true;
}

void IThread::join()
{
	if (m_bStarted && m_thread) {
		if (m_thread->joinable()) {
			m_thread->join();
		}
	}
	m_bStarted = false;
}

LINK_CORE_NAMESPACE_END

QueryDataCmdThread.h

#pragma once
#include "IThread.h"
#include "DataType.h"
#include <string>
#include <QByteArray>
using namespace xyLinkCore;

class CQueryDataCmdThread : public IThread
{
public:
	CQueryDataCmdThread (PUInt64 chaissID, PUInt64 signalID);
	virtual ~CQueryDataCmdThread ();

public:
	int start();
	int stop();

private:
	void  run() override;
	void  sendQueryCmd();
	void  encodeDa
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值