【无标题】

多线程创建(2)

成员函数作为线程入口并封装线程基类接口

- 使用前面的[多线程创建(1)](https://blog.csdn.net/Soledad1206/article/details/126512175)中的方法创建子线程,可以支持全局函数或者静态成员函数作为线程的入口函数
- 使用全局函数座位线程入口会存在变量的生命周期问题,即主函数中变量的内存已经被释放,但是线程还没有结束,会造成程序异常。
- 使用对象创建线程,可以使用成员变量减少冗余的变量,直接将对象本身作为线程参数传入。
#include<iostream>
#include<string>
#include<thread>

using namespace std;

class myThread
{
public:
	void Main()
	{
		cout << "myThread Main" << name << endl;
	}
	string name;
};

int main(int argc, char** argv)
{
	myThread th;
	th.name = "Test myThread name 001";
	thread th(&myThread::main, &th);
	th.join();
	return 0;
}

线程基类的封装

- 设计线程基类可以实现对于线程的封装,如果需要新建新的线程,直接从线程基类去继承就可以
- 使用线程基类,可以将线程生命周期的管理,线程的退出管理等放到线程基类中去做
#include<iostream>
#include<string>
#include<thread>

using namespace std;
class BaseThread
{
//线程基类的封装
public:
	virtual void Start();//线程的启动函数
	virtual void Wait();
	virtual void Stop();
	bool is_exit();
private:
	virtual void Main() = 0;//线程入口函数,线程的启动函数Start()函数中需要调用线程的入口函数Main()函数,但是每个子线程有自己的实现,因此使用纯虚函数,同时纯虚函数可以强制子类中必须有入口函数的实现
	std::thread th_;//将线程完全封装,避免线程的生命周期管理混乱, 
	bool is_exit_ = false;//线程的退出标志

};

void BaseThread::Start()
{
	is_exit_ = false;
	th_ = std::thread(&BaseThread::Main, this);
}
void BaseThread::Wait()
{
	if (th_.joinable())
		th_.join();
}
void BaseThread::Stop()
{
	is_exit_ = true;
}
bool BaseThread::is_exit()
{
	return is_exit_;
}





class derivedThread : public BaseThread
{
public:
	void Main() override;//override防止重载函数出错
	string name;
};
void derivedThread::Main()
{
	cout << "Test derivedThread Main begin!" << endl;
	while (!is_exit())
	{
		std::this_thread::sleep_for(100ms);
		cout << "." << flush;
	}
	cout << endl << "Test derivedThread Main end!" << endl;
}

int main(int argc, char** argv)
{
	derivedThread testth;
	testth.name = "derivedThread test name 002";
	testth.Start();
	this_thread::sleep_for(3s);
	testth.Stop();
	testth.Wait();
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值