C++模拟实现线程池及多线程原子打印

C++模拟实现线程池及多线程原子打印

#include <iostream>
#include <thread>
#include <vector>
#include <unordered_map>
#include <mutex>
#include <condition_variable>

using namespace std;

namespace myTest {

class Task {
public:
	template<typename FUNCTION, typename ...ARGS>
	Task(FUNCTION &&func, ARGS ...args) {
		func = bind(func, forward<ARGS>(args)...);
	}

	void run() {
		func();
		return ;
	}

	~Task() {}

private:
	function<void()> func;

};


class TreadPool {
public:
	TreadPool(int n = 5) {
		for ( int i = 0; i < n; i++ ) {
			threads.push_back(new thread(&worker_thread, this));  // 标注1
		}
	}

	template<typename FUNCTION, typename ...ARGS>
	void addOneTask(FUNCTION &&func, ARGS ...args) {
		unique_lock<mutex> lock(m_mutex);
		tasks.push(new Task(func, forward<ARGS>(args)...));
		m_cond.notify_one();
	}

    // 标注6
	void stop_thread() {
		thread::id id = this_thread::get_id();
		running[id] = false;
		return ;
	}

    // 标注5
	void stop() {
		for ( int i = 0; i < threads.size(); i++ ) {
			this->addOneTask(&stop_thread, this);
		}
		for ( auto t : threads ) {
			t->join();
		}
		return ;
	}


private:
	vector<thread *> threads;
	queue<Task *> tasks;
    unordered_map<thread::id, bool> running;
	mutex m_mutex;
	condition_variable m_cond;
	
	void worker_thread() {
		thread::id id = this_thread::get_id();  // 标注2
		running[id] = true;
		while ( running[id] ) {
			Task *t = this->getOneTask();
			t->run();
			delete t;
		}	
		return ;
	}

	Task *getOneTask() {
		unique_lock<mutex> lock(m_mutex);  // 标注3
		while ( tasks.empty() ) {
			m_cond.wait(lock);  // 标注4
		}
		Task *temp = tasks.front();
		tasks.pop();
		return temp;
	}
};

} // end of myTest

标注:

  1. thread构造函数

    // Creates new thread object which does not represent a thread.
    thread() noexcept;
    
    // Move constructor. Constructs the thread object to represent the thread of execution that was represented by other. After this call other no longer represents a thread of execution.
    thread( thread&& other ) noexcept;
    
    // Creates new std::thread object and associates it with a thread of execution.
    template< class Function, class... Args >
    explicit thread( Function&& f, Args&&... args );
    
    // The copy constructor is de
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值