C++开启线程(简单封装)

此样例对原始的线程接口进行简单封装,使之更易于使用。

使用时只需继承Thread类并实现loop()函数,在需要启动线程的地方调用run()函数即可启动线程。
样例执行结果:
在这里插入图片描述

main.cpp

#include <iostream>

#include "Thread.h"

namespace
{
    class MyThread : public Thread
    {
        //重载线程执行函数
        const bool loop(void)
        {
            static int count = 0;
            std::cout << "count:" << count++ << std::endl;
            return 3 != count;
        }
    };
}

int main()
{
    MyThread th;
    th.run();
    
    //延时一下才能看到效果
    #ifdef WIN32
    std::this_thread::sleep_for(std::chrono::nanoseconds(10 * 1000 * 1000));
    #elif __GNUC__
    usleep(10*1000);
    #endif

    return 0;
}

Thread.h

#pragma once

#include <thread>
#include <mutex>

#define DEBUG printf("--%d-- --%s-- Debug!!\n", __LINE__, __FILE__);

class Mutex : public std::mutex
{
public:
	Mutex() {};
	~Mutex() {};

	class AutoLock
	{
		private:
			Mutex* mtx;
		public:
			AutoLock(Mutex& mutex)
			{
				mtx = &mutex;
				mtx->lock();
			}
			~AutoLock() 
			{
				mtx->unlock();
			}
	};
};

class Thread : public std::thread
{
private:
	//启动线程函数锁
	Mutex mRunMutex;

	//线程是否正在运行标志 
	bool mIsThreadRunning;
	Mutex mIsThreadRunningMutex;

	//请求退出线程函数标志
	bool mIsSetQuitThread;
	Mutex mIsSetQuitThreadMutex;

private:
	/*
	* @brife 获取线程函数是否运行状态,当未运行则标记位运行
	* @return true 线程函数为运行,标记线程位运行;false 线程函数未运行
	*/
	const bool setThreadLoopRunning(void);

protected:
	/*
	* @brife 清除请求退出线程标志
	*/
	void clearSetQuitThreadFlag(void);

public:
	Thread();
	~Thread();

	/*
	* @brife 当线程未启动时,启动线程
	* @return true 启动成功;false 启动失败 
	*/
	const bool run(void);

	/*
	* @brife 获取线程是否运行
	* @return true 线程正在运行;false 线程已经退出运行
	*/
	const bool isThreadRunning(void);

	/*
	* @brife 清除线程运行标志
	*/
	void clearIsthreadRunningFlag(void);

	/*
	* @brife 向线程置标志位退出执行
	*/
	void setQuitThread(void);

	/*
	* @brife 获取是否请求退出标志
	* @return true 当前请求退出;false 当前未请求退出
	*/
	const bool isSetQuitThread(void);

	/*
	* @brife 向线程置标志位退出执行并等待直至退出
	*/
	void setQuitThreadAndWaitForQuit(void);

	/*
	* @brife 使用者自行定义,这个函数是实际执行函数
	* @return true 再次执行此函数;false 退出执行此函数,线程执行结束
	*/
	virtual const bool loop(void) = 0;
};


Thread.cpp

#include "Thread.h"

namespace
{

	/*
	* @brife 线程执行函数
	*/
	static void threadRun(void* argc)
	{
		while (false == ((Thread*)argc)->isSetQuitThread() && ((Thread*)argc)->loop()) {}
		//清除线程正在运行标志
		((Thread*)argc)->clearIsthreadRunningFlag();
	}
}

Thread::Thread()
{
	mIsThreadRunning = false;
	mIsSetQuitThread = false;
}

Thread::~Thread()
{

}

const bool Thread::setThreadLoopRunning(void)
{
	Mutex::AutoLock lock(mIsThreadRunningMutex);
	if (false == mIsThreadRunning)
	{
		mIsThreadRunning = true;
		return true;
	}
	return false;
}

void Thread::clearSetQuitThreadFlag(void)
{
	Mutex::AutoLock lock(mIsSetQuitThreadMutex);
	mIsSetQuitThread = false;
}

const bool Thread::run(void)
{ 
	Mutex::AutoLock lock(mRunMutex);
	//设置状态失败,当前正在执行线程函数,函数返回
	if (false == setThreadLoopRunning())
	{
		return false;
	}
	//清除退出线程执行函数请求
	clearSetQuitThreadFlag();
	//开启线程
	std::thread th(threadRun, this);
	th.detach();
	return true;
}

const bool Thread::isThreadRunning(void)
{
	Mutex::AutoLock lock(mIsThreadRunningMutex);

	return mIsThreadRunning;
}

void Thread::clearIsthreadRunningFlag(void)
{
	Mutex::AutoLock lock(mIsThreadRunningMutex);

	mIsThreadRunning = false;
}

void Thread::setQuitThread(void)
{
	Mutex::AutoLock lock(mIsSetQuitThreadMutex);
	mIsSetQuitThread = true;
}

const bool Thread::isSetQuitThread(void)
{
	Mutex::AutoLock lock(mIsSetQuitThreadMutex);
	return mIsSetQuitThread;
}

void  Thread::setQuitThreadAndWaitForQuit(void)
{
	while (true == isSetQuitThread()) { setQuitThread(); }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值