基于c++11的线程池

c++11中加入了线程库,从此标准库可支持并发。以下,以线程池为例,给出并发调用示例。

线程池:

管理一个任务队列,一个线程队列,然后每次取一个任务分配给一个线程去做。循环往复。

#pragma once
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

class extract_base {
public:
	virtual void process(void* data) = 0;
};

template
class thread_pool {
public:
	thread_pool(int thread_num) {
		this->thread_num = thread_num;
		stop = false;
		for (int i = 0; i < thread_num; i++) {
			extract_base* extractor = new ExtractType;
			threads_.emplace_back([this, extractor] {
				while (1) {
					void* data;
					{
						unique_lock lock(this->cv_m);
						this->cv.wait(lock, [this] {return this->stop || !this->datas_.empty(); });
						if (this->stop && this->datas_.empty()) return;
						data = this->datas_.front();
						this->datas_.pop();
					}
					extractor->process(data);
				}
			});
			extractors_.push_back(extractor);
		}
	}

	void add(void* data) {
		unique_lock lock(cv_m);
		datas_.push(data);
		cv.notify_one();
	}

	~thread_pool() {
		stop = true;
		cv.notify_all();
		for (int i = 0; i < thread_num; i++) {
			threads_[i].join();
			delete extractors_[i];
			extractors_[i] = NULL;
		}
	}
private:
	int thread_num;
	vector threads_; //线程队列
	vector extractors_; //核心处理过程,与线程对象一一绑定
	queue datas_; //数据队列
	atomic stop;
	condition_variable cv;
	mutex cv_m;
};

说明:

关于wait():等待(阻塞),直到满足给定条件。

atomic:原子数据类型。确保同一时刻只有唯一的线程对这个资源进行访问。

thread.join():当前主线程等待所有子线程执行完,才退出。

thread.detach():脱离主线程的绑定,主线程挂了,子线程不报错,子线程执行完自动退出。

你可能感兴趣的:(c/c++学习,c/c++程序小片段)