C++线程常见包装类实现

Posted 顾文繁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++线程常见包装类实现相关的知识,希望对你有一定的参考价值。

C++多线程不如Java那样启动和停止线程那么优雅,如何做到开启线程像Java那样呢?本文将介绍常见的封装C++11线程方式。
线程和其他任务一个样,开启,执行,结束。在CPP当中,执行任务这这一过程就相当于一个回调函数一样,在Java当中有开启线程的方式继承Thread和实现Runnable接口,哈哈哈哈哈哈,一下回到大二听贾老师了属于是,那我们就来实现Java当中的集成Thread这种方式。

定义接口

  1. Start ()
  2. Stop()
  3. 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++线程常见包装类实现的主要内容,如果未能解决你的问题,请参考以下文章

C++线程常见包装类实现

通过 CLI 包装器在非托管 C++ 中使用 C#.NET Winform - 需要线程?

并发编程常见问答

并发编程常见问答

并发编程常见问答

PySide 中的多线程提升 Python C++ 代码