C++线程常见包装类实现
Posted 顾文繁
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++线程常见包装类实现相关的知识,希望对你有一定的参考价值。
C++多线程不如Java那样启动和停止线程那么优雅,如何做到开启线程像Java那样呢?本文将介绍常见的封装C++11线程方式。
线程和其他任务一个样,开启,执行,结束。在CPP当中,执行任务这这一过程就相当于一个回调函数一样,在Java当中有开启线程的方式继承Thread和实现Runnable接口,哈哈哈哈哈哈,一下回到大二听贾老师了属于是,那我们就来实现Java当中的集成Thread这种方式。
定义接口
- Start ()
- Stop()
- Main()
这里的Start()和Stop()函数都是virtual ,可被重载,有自己的实现方式,但是Main()肯定不能有默认的实现方式,所以Main(),肯定是是一个纯虚函数。
多线程时,经常涉及到资源的互斥访问,因此添加信号量或者信号量也是很有必要的,这里我使用C++11的mutex。MyThread的头文件为:
#pragma once
#include <thread>
#include <mutex>
class MyThread
{
public:
virtual void Start();
virtual void Stop();
protected:
virtual void Main() = 0;
protected:
std::thread th_;
bool is_exit_;
std::mutex mtx_;
};
这里定义的is_exit_是停止信号。
实现
#include "my_thread.h"
using namespace std;
void MyThread::Start()
{
is_exit_ = false;
//启动线程
th_ = thread(&MyThread::Main, this);
}
void MyThread::Stop()
{
is_exit_ = true;
if (th_.joinable()) //判断子线程是否可以同步等待
{
th_.join(); //同步等待子线程
}
}
C++11线程的join可以理解为加入到主线程或者合并到主线程。
定义的Main()函数要在继承类中实现:virtual void Main();
以上是关于C++线程常见包装类实现的主要内容,如果未能解决你的问题,请参考以下文章