C++11中多线程例子
2016-03-31 21:10
489 查看
C++11开始自带线程相关的操作库。这里举个例子,以并发编程最经典的例子,生产者消费者的例子来示例在C++11使用标准库提供的线程库来进行并发编程。
这里为了方便线程的使用,参考了android源码中对pthread的封装。
对其进行了简单的封装,如果需要使用线程,继承
生产者
消费者
这里使用了
这里为了方便线程的使用,参考了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; }
相关文章推荐
- leetcode 322. Coin Change 解题思路 C语言
- [引用区别] c++中引用与java中引用区别
- 各种排序算法总结(C++实现)
- 【C++】内存的那些事儿
- C++ txt文件插入字符时,未换行问题
- C++中的单例模式
- 堆排序(C++实现)
- C++第二次上机作业
- (OK) 在Android系统上运行C/C++程序
- C++第二次上机实验(真)
- 算法 - 求和为n的连续正整数序列(C++)
- C++ 几种智能指针的简单实现
- 機器學習基石 机器学习基石 (Machine Learning Foundations) 作业二 Q19-20 C++实现
- 判断素数并求和用平方根算法(C语言)
- C++中的GetTickCount()和Sleep()
- 求数字特征值(C语言)
- 汉诺塔问题解决
- C语言学习002:第一个完整的C程序代码
- C++实验2-标准体重
- C++中cout控制输出格式和读写txt文件