自定义线程

本文介绍了如何使用C++实现一个名为BaseThread的类,它提供线程的启动、暂停、终止功能,并确保任务安全执行。通过互斥量和条件变量管理线程状态和任务队列。
摘要由CSDN通过智能技术生成

解决如下问题:

  • 可不断加入预执行函数
  • 安全的暂停和终止线程操作

BaseThread.h

#pragma once
#include <thread>
#include <iostream>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <queue>

using namespace std;

class BaseThread
{
public:
	enum RunningState
	{
		START = 0,
		PAUSE,
		STOP
	};
	
	BaseThread();
	~BaseThread() = default;
	
	// 开启线程
	void ThreadStart();
	// 暂停线程
	void ThreadPause();
	// 终止线程
	void ThreadStop();
	// 得到线程状态
	RunningState GetRunningState();
	// 添加任务
	bool AddTask(function<bool()> func);

protected:
	void Run();
	// 执行任务,主要是任务队列中取任务和执行任务的操作
	void TaskAction();
	// 挂起等待
	void WaitIfPaused();


private:
	RunningState m_state;			// 线程状态
	unique_ptr<thread> m_thread;	// 包裹智能指针的线程
	queue<function<bool()>> taskQueue;	// 任务队列
	mutex mtx;						// 互斥量
	condition_variable cond;		// 主动暂停条件变量
	condition_variable cond_queueEmpty;	// 队列空条件变量
};

BaseThread.cpp

#include "BaseThread.h"


BaseThread::BaseThread() {
	m_thread = unique_ptr<thread>(new thread(&BaseThread::Run, this));
	m_thread->detach();
}

void BaseThread::ThreadStart(){
	unique_lock<mutex> lock(mtx);
	m_state = RunningState::START;
	cond.notify_one();
}

void BaseThread::ThreadPause() {
	unique_lock<mutex> lock(mtx);
	m_state = RunningState::PAUSE;
}

void BaseThread::ThreadStop() {
	unique_lock<mutex> lock(mtx);
	m_state = RunningState::STOP;
	cond.notify_one();
}

BaseThread::RunningState BaseThread::GetRunningState() {
	return m_state;
}

void BaseThread::Run() {
	m_state = RunningState::START;
	cout << "thread ID:" << this_thread::get_id << " is start!\n";
	// 之所以这种方法终止线程安全,是因为该执行的模块都一起执行完了才退出循环。
	while (GetRunningState() != RunningState::STOP) {
		WaitIfPaused();
		if (GetRunningState() == RunningState::START) TaskAction();
	}
	cout << "Thread ID : " << this_thread::get_id << " is stop.\n";
}

void BaseThread::TaskAction() {
	unique_lock<mutex> lock(mtx);
	m_state = RunningState::PAUSE;
	cond_queueEmpty.wait(lock, [this] {return !taskQueue.empty(); });
	m_state = RunningState::START;
	taskQueue.front()();
	taskQueue.pop();
}

void BaseThread::WaitIfPaused() {
	unique_lock<mutex> lock(mtx);
	cond.wait(lock, [this] {return GetRunningState() != RunningState::PAUSE; });
}



bool BaseThread::AddTask(function<bool()> func) {
	if (func == NULL) return false;
	unique_lock<mutex> lock(mtx);
	taskQueue.push(func);
	cond_queueEmpty.notify_one();
	return true;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值