利用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,简单定制自己的线程类的主要内容,如果未能解决你的问题,请参考以下文章

多线程九 原子类

C++11消息队列 + Qt线程池 + QRunnable执行任务简单模型

C++11线程库

第十八章 定制特性

c++11 多线程 -- 基本使用

C++11中多线程库