Linux下简单的线程池模型实现

    为了充分利用多核的优势,程序一般会开启多个进程或者线程去处理任务。进程是资源分配的基本单位,而线程是执行和调度的基本单位。因此多线可以充分利用多核,而且因为共享资源,线程间数据共享便于程序开发,而进程间通讯就没有那么方便。

     但是由于多个线程共享同一进程的资源,如果其中一个线程现了段错误或者其它的致命错误,会导致整个程序退出,而多进程程序,由于进程的资源是独立的,如果某一个程序出现错误也只会影响一个进程。

    多线程中由于线程间共享资源,对于公共资源的排他性,同一时刻只能有一个线程访问资源,所以为了次序访问资源,需要锁的帮助。影响服务器的四大杀手分别是:1、数据拷贝 2、环境切换 3、内存分配 4、锁竞争。所以在多线程变成中需要注意合理用锁。

    多线程编程为了提高程序执行效率,但是每当有任务是就创建一个线程去处理任务,处理完成后再销毁线程,这样显然会不太方便同时也会影响效率。我们可以创建一组线程,统一管理,如同一个池子,里面有多个线程。有任务到来,就放到池子中,由池子中的线程处理而不会销毁线程,这个便是线程池。线程池其实生产者与消费者模型类似。生产者产生任务,将任务丢到任务队列中,线程池中的线程作为消费者,从任务队列中,取出任务执行。

 

 

 

为了减少锁竞争,可以为每一个消费者配一个任务队列,根据每个消费者(线程)的任务数,将任务投递给任务数最少的线程

 

 

下面是针对每线程每队列方式实现的线程池

NoneCopyCtorAssign.h文件

#ifndef NONE_COPY_ABLE_H_
#define NONE_COPY_ABLE_H_

class NoneCopyCtorAssign
{
protected:
	NoneCopyCtorAssign() {}
	~NoneCopyCtorAssign() {}
private:
	NoneCopyCtorAssign(const NoneCopyCtorAssign&);
	NoneCopyCtorAssign& operator=(const NoneCopyCtorAssign&);
};

#endif

Mutex.h文件

#ifndef __BASE_MUTEX_H_
#define __BASE_MUTEX_H_

#include <pthread.h>
#include "NoneCopyCtorAssign.h"


class Mutex : private NoneCopyCtorAssign
{
public:
	Mutex()
	{
		pthread_mutex_init(&_mutex, NULL);
	}
	~Mutex()
	{
		pthread_mutex_destroy(&_mutex);
	}
	void lock()
	{
		pthread_mutex_lock(&_mutex);
	}
	void unlock()
	{
		pthread_mutex_unlock(&_mutex);
	}
	pthread_mutex_t *getMutex()
	{
		return &_mutex;
	}
private:
	pthread_mutex_t _mutex;
};

class MutexGuard : NoneCopyCtorAssign
{
public:
	explicit MutexGuard(Mutex &mutex)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值