http文件服务器 多线程,Http服务器-第四步加入线程池和文件缓存

文件ThreadPool.cpp

#include "ThreadPool.h"

#include "winsock.h"

#include "stdlib.h"

#include "stdio.h"

#include "string.h"

#include

#include

#include

#include

#include "Defs.h"

#include "FileCache.h"

#include "HttpRequest.h"

#include "HttpRespone.h"

using namespace std;

void SendThread(HttpRespone* rep)

{

send(rep->sock, (const char*)rep->header, rep->header_size, 0);

send(rep->sock, (const char*)rep->buffer,rep->size, 0);

}

class ThreadCounterRAII

{

public:

ThreadCounterRAII()

{

_count.fetch_add(1);

}

static atomic _count;

~ThreadCounterRAII()

{

_count.fetch_sub(1);

}

};

atomic ThreadCounterRAII::_count = 0;

void ProcessRequestThread(HttpRequest*request )

{

ThreadCounterRAII counter;

..........

}

ThreadPool * ThreadPool::getInstance()

{

static ThreadPool * ins = nullptr;

if (!ins)ins = new ThreadPool;

return ins;

}

void ThreadPool::WorkThread()

{

while (true)

{

this->_mutex.lock();

while(this->works.empty())

{

this->_cond.wait(this->_mutex);

}

HttpRequest * req = this->works.front();

this->works.pop();

this->_mutex.unlock();

ProcessRequestThread(req);

}

}

void ThreadPool::addTask(HttpRequest*work)

{

this->_mutex.lock();

this->works.push(work);

this->_mutex.unlock();

this->_cond.notify_one();

}

ThreadPool::ThreadPool()

{

int MAX_THREADS = std::thread::hardware_concurrency();

while (MAX_THREADS--)

{

std::thread t(std::bind(&ThreadPool::WorkThread, this));

t.detach();

this->workers.push_back(std::move(t));

}

}

程序初始化时启动 10个工作线程,主线程接收到的TCP链接请求全部加入请求队列,工作线程处理

主线程:Application.cpp

while (true)

{

int sock_client = accept(sock, (sockaddr *)&client_ipaddr, &length);

if (sock_client == SOCKET_ERROR)

{

return;

}

HttpRequest*req = new HttpRequest;

req->sock = sock_client;

ThreadPool::getInstance()->addTask(req);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值