C++11中多线程例子

Posted 写了程序换酒钱

tags:

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

C++11开始自带线程相关的操作库。这里举个例子,以并发编程最经典的例子,生产者消费者的例子来示例在C++11使用标准库提供的线程库来进行并发编程。

这里为了方便线程的使用,参考了android源码中对pthread的封装。

class Thread

public:
    Thread()
        : m_running(false)
    
    

    virtual ~Thread()
    
        if(m_running) 
            m_running = false;
        
    
    
    Thread(const Thread&) = delete;

    Thread& operator=(const Thread&) = delete;

    virtual bool threadRun() = 0;

    bool start()
    
        if (m_running) 

        
        else 
            m_running = true;
            m_thread.reset(new std::thread(std::bind(&Thread::runImpl, this)));
            m_thread->detach();
        
        return m_running;
    

    bool stop()
    
        return m_running = false;
    


private:
    void runImpl()
    
        while (m_running && threadRun());
    

    std::shared_ptr<std::thread> m_thread;
    std::atomic_bool m_running;

;

对其进行了简单的封装,如果需要使用线程,继承Thread和实现threadRun这个接口,如果其返回true,那么线程将重复调用这个接口,如果其返回为false,那么线程将退出执行。

生产者

class ProduceThread : public Thread

public:
    ProduceThread(std::queue<int> &q_, std::condition_variable& cv_, std::mutex& mutex_)
        : Thread()
        , m_q(q_)
        , m_cv(cv_)
        , m_mutex(mutex_)
    

    

    bool threadRun()
    
        sleep(rand() % 9);
        
        	std::unique_lock<std::mutex> _lock(m_mutex);
        	int _t = rand();
        	m_q.push(_t);
        	std::cout << "ProduceThread---" << _t << '\\n';
        
        m_cv.notify_one();
        return true;
    

private:
    std::queue<int>& m_q;
    std::condition_variable& m_cv;
    std::mutex& m_mutex;
;

消费者

class ConsumerThread : public Thread

public:
    ConsumerThread(std::queue<int> &q_, std::condition_variable& cv_, std::mutex& mutex_)
        : Thread()
        , m_q(q_)
        , m_cv(cv_)
        , m_mutex(mutex_)
    

    

    bool threadRun()
    
	sleep(rand() % 4)
        std::unique_lock<std::mutex> _lock(m_mutex);
        if (m_q.empty()) 
            m_cv.wait(_lock);
         else 
            std::cout << "ConsumerThread---" << m_q.front() << '\\n';
            m_q.pop();
        
        return true;

    

private:
    std::queue<int>& m_q;
    std::condition_variable& m_cv;
    std::mutex& m_mutex;
;

这里使用了condition_variable来进行线程间的同步。

int main(int argc, char *argv[])

    std::cout << "Hello World!" << std::endl;
    
    std::condition_variable _cv;
    std::mutex _mutex;
    std::queue<int> _queue;

    ProduceThread pt(_queue, _cv, _mutex);
    ConsumerThread cp(_queue, _cv, _mutex);

    cp.start();
    pt.start();
    sleep(20);

    return 0;

20220410 修改代码bug

以上是关于C++11中多线程例子的主要内容,如果未能解决你的问题,请参考以下文章

C++11中多线程库

C中多线程的同步

C中多线程python扩展中的段错误

C ++中多线程的安全性与速度[关闭]

Java中多线程通信怎么实现

MFC中多线程中静态函数调用成员函数的问题