利用c++11,简单定制自己的线程类
Posted unclerunning
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用c++11,简单定制自己的线程类相关的知识,希望对你有一定的参考价值。
利用c++11,简单定制自己的线程类
simplethread.h
#ifndef SIMPLETHREAD_H
#define SIMPLETHREAD_H
#include <thread>
#include <condition_variable>
#include <memory>
using namespace std::chrono;
class SimpleThread
public:
SimpleThread() :m_finished(false),
m_isStart(false)
void start()
m_thd = std::make_unique<std::thread>(&SimpleThread::entry,this);
m_tid = m_thd->get_id();
m_thd->detach(); // 分离线程
m_isStart = true;
bool wait(milliseconds waitTime)
bool ret = true;
if (!m_isStart)
return ret;
std::unique_lock<std::mutex> lock(m_cvM);
while (!m_finished)
if (m_cv.wait_for(lock, waitTime) == std::cv_status::timeout)
ret = false;
break;
return ret;
void wait()
if (!m_isStart)
return;
std::unique_lock<std::mutex> lock(m_cvM);
while (!m_finished)
m_cv.wait(lock);
std::thread::id getTid() return m_tid;
// 虚函数,子类实现
virtual void run()
protected:
SimpleThread(const SimpleThread&) = delete;
SimpleThread& operator =(const SimpleThread&) = delete;
private:
void entry()
// 真正执行的是一个动态的虚函数
this->run();
m_isStart = false;
// 线程结束
std::unique_lock<std::mutex> lock(m_cvM);
m_finished = true;
lock.unlock();
// 结束条件满足,唤醒所有等待该线程结束的线程
m_cv.notify_all();
private:
std::mutex m_cvM;
std::condition_variable m_cv;
bool m_finished;
bool m_isStart;
std::thread::id m_tid;
std::unique_ptr<std::thread> m_thd;
;
#endif // !SIMPLETHREAD_H
用上面定制的线程类作基类,通过重写run方法,让线程跑我们的run函数:
#include "simplethread.h"
#include <iostream>
class MyThreadClass :public SimpleThread
public:
void run()
std::this_thread::sleep_for(milliseconds(1000));
std::cout << "thread id:" << std::this_thread::get_id()<< std::endl;
;
以上是关于利用c++11,简单定制自己的线程类的主要内容,如果未能解决你的问题,请参考以下文章