mysql,redis客户端连接池和线程池的Windows C/C++编程实现(★firecat推荐★)

简介: mysql,redis客户端连接池和线程池的Windows C/C++编程实现(★firecat推荐★)

一、环境准备:

Windows,VS2015


Mysql使用官方c语言版本客户端,mysql-connector-c-6.1.10-win32.zip,不使用c++库,因为c++库依赖boost库

https://downloads.mysql.com/archives/c-c/

库函数和头文件使用方法参见http://blog.csdn.net/libaineu2004/article/details/79607432




Redis使用开源的cpp_redis库,是c++语言实现

https://github.com/Cylix/cpp_redis   v4.3.1


https://github.com/Cylix/tacopie      v3.2.0


https://cylix.github.io/cpp_redis/html/classcpp__redis_1_1client.html


库函数和头文件使用方法参见http://blog.csdn.net/libaineu2004/article/details/79582185




二、完整的工程源码下载地址:https://download.csdn.net/download/libaineu2004/10300060


源码涉及线程池和连接池的实现,C++11语法,关注一下线程安全退出的方法


ThreadPool.cpp

#include "stdafx.h"
#include <stdlib.h>
#include <windows.h>
#include "ThreadPool.h"
///
CWorkerThread::CWorkerThread()//:m_thread(StartRoutine, this) //c++中类的成员对象初始化
{
  m_thread_idx = 0;
  m_task_cnt = 0;
  m_task_list.clear();
}
CWorkerThread::~CWorkerThread()
{
}
void CWorkerThread::Start()
{
  //t[i] = thread(std::mem_fn(&MyClass::thread_func), Object, args..);
  //thread t(std::bind(&TestThread::run, this));
  m_bExit = false;
  thread t(StartRoutine, this);
  t.detach();
}
void* CWorkerThread::StartRoutine(void* arg)
{
  CWorkerThread* pThread = (CWorkerThread*)arg;
  pThread->m_bRunning = true;
  pThread->Execute();
  pThread->m_bRunning = false;
  return NULL;
}
void CWorkerThread::Stop(void)
{
  m_mutex.lock();
  m_bExit = true;
  m_task_list.clear();
  m_mutex.unlock();
}
void CWorkerThread::Execute()
{
  while (true) {
    // put wait in while cause there can be spurious wake up (due to signal/ENITR)
    while (m_task_list.empty()) {
      if (m_bExit)
      {
        return;
      }
      std::this_thread::sleep_for(std::chrono::milliseconds(1));//等同于Sleep(1);
      continue;
    }
    m_mutex.lock();
    CTask* pTask = m_task_list.front();
    m_task_list.pop_front();
    m_mutex.unlock();
    pTask->run();
    delete pTask;
        pTask = NULL;
    m_task_cnt++;
        printf("thread%d have the execute %d task\n", m_thread_idx, m_task_cnt);
    //printf("test thread id:%xH\n", std::this_thread::get_id());//这个返回的id不是整数,不能直接打印输出
  }
}
void CWorkerThread::PushTask(CTask* pTask)
{
  m_mutex.lock();
  m_task_list.push_back(pTask);
  m_mutex.unlock();
}
//
CThreadPool::CThreadPool()
{
  m_worker_size = 0;
  m_worker_list = NULL;
}
CThreadPool::~CThreadPool()
{
    Destory();
}
int CThreadPool::Init(uint32_t worker_size)
{
    m_worker_size = worker_size;
  m_worker_list = new CWorkerThread[m_worker_size];
  if (!m_worker_list) {
    return 1;
  }
  for (uint32_t i = 0; i < m_worker_size; i++) {
    m_worker_list[i].SetThreadIdx(i);
    m_worker_list[i].Start();
  }
  return 0;
}
void CThreadPool::Destory()
{
    if (m_worker_list)
    {
    for (int i = 0; i < m_worker_size; i++)
    {
      m_worker_list[i].Stop();
    }
    for (int i = 0; i < m_worker_size; i++)
    {
      while (m_worker_list[i].IsRunning())
      {
        Sleep(1);//等待线程安全退出
      }
    }
        delete [] m_worker_list;
        m_worker_list = NULL;
    }
}
void CThreadPool::AddTask(CTask* pTask)
{
  /*
   * select a random thread to push task
   * we can also select a thread that has less task to do
   * but that will scan the whole thread list and use thread lock to get each task size
   */
  uint32_t thread_idx = rand() % m_worker_size;
  m_worker_list[thread_idx].PushTask(pTask);
}

ThreadPool.h


#ifndef THREADPOOL_H_
#define THREADPOOL_H_
#include <stdio.h>
#include <stdint.h>
#include <string>
#include <string.h>
#include "Task.h"
#include <list>
#include <thread>
#include <mutex>
using namespace std;
class CWorkerThread {
public:
  CWorkerThread();
  ~CWorkerThread();
  static void* StartRoutine(void* arg);
  void Start(void);
  void Stop(void);
  void Execute(void);
  void PushTask(CTask* pTask);
  void SetThreadIdx(uint32_t idx) { m_thread_idx = idx; }
  bool IsRunning(void) { return m_bRunning; }
private:
  uint32_t  m_thread_idx;
  uint32_t  m_task_cnt;
  //thread          m_thread;
  mutex         m_mutex;
  list<CTask*>  m_task_list;
  bool            m_bExit;
  bool            m_bRunning;
};
class CThreadPool {
public:
  CThreadPool();
  virtual ~CThreadPool();
  int Init(uint32_t worker_size);
  void AddTask(CTask* pTask);
  void Destory();
private:
  uint32_t    m_worker_size;
  CWorkerThread*  m_worker_list;
};
#endif /* THREADPOOL_H_ */


三、欢迎访问姊妹篇


mysql,redis客户端连接池和线程池的Linux C编程实现(★firecat推荐★)


相关文章
|
数据可视化 关系型数据库 MySQL
嵌入式C++、STM32、MySQL、GPS、InfluxDB和MQTT协议数据可视化
通过本文的介绍,我们详细讲解了如何结合嵌入式C++、STM32、MySQL、GPS、InfluxDB和MQTT协议,实现数据的采集、传输、存储和可视化。这种架构在物联网项目中非常常见,可以有效地处理和展示实时数据。希望本文能帮助您更好地理解和应用这些技术,构建高效、可靠的数据处理和可视化系统。
894 82
|
关系型数据库 MySQL 数据库
【MySQL基础篇】MySQL概述、Windows下载MySQL8.0超详细图文安装教程
在这一章节,主要介绍两个部分,数据库相关概念及MySQL数据库的介绍、下载、安装、启动及连接。接着,详细描述了MySQL 8.0的版本选择与下载,推荐使用社区版(免费)。安装过程包括自定义安装路径、配置环境变量、启动和停止服务、以及客户端连接测试。此外,还提供了在同一台电脑上安装多个MySQL版本的方法及卸载步骤。最后,解释了关系型数据库(RDBMS)的特点,即基于二维表存储数据,使用SQL语言进行操作,格式统一且便于维护。通过具体的结构图展示了MySQL的数据模型,说明了数据库服务器、数据库、表和记录之间的层次关系。
2709 56
【MySQL基础篇】MySQL概述、Windows下载MySQL8.0超详细图文安装教程
|
缓存 弹性计算 NoSQL
【Azure Redis 缓存 Azure Cache For Redis】Redis连接池
【Azure Redis 缓存 Azure Cache For Redis】Redis连接池
270 0
|
数据采集 机器学习/深度学习 前端开发
PHP爬虫性能优化:从多线程到连接池的实现
本文介绍了一种通过多线程技术和连接池优化PHP爬虫性能的方法,以新浪投诉平台为例,详细展示了如何提高数据采集效率和稳定性,解决了传统单线程爬虫效率低下的问题。
470 2
PHP爬虫性能优化:从多线程到连接池的实现
|
安全 关系型数据库 MySQL
Windows Server 安装 MySQL 8.0 详细指南
安装 MySQL 需要谨慎,特别注意安全配置和权限管理。根据实际业务需求调整配置,确保数据库的性能和安全。
1586 9
|
关系型数据库 MySQL Linux
MySQL数据库下载安装教程(Windows&Linux)
本文档详细介绍了MySQL的安装步骤,包括安装前的准备工作、下载安装包、Windows和Linux系统下的具体安装流程,以及如何配置MySQL服务、设置环境变量、启动服务和连接数据库等关键操作。
|
Java 关系型数据库 MySQL
【编程基础知识】Eclipse连接MySQL 8.0时的JDK版本和驱动问题全解析
本文详细解析了在使用Eclipse连接MySQL 8.0时常见的JDK版本不兼容、驱动类错误和时区设置问题,并提供了清晰的解决方案。通过正确配置JDK版本、选择合适的驱动类和设置时区,确保Java应用能够顺利连接MySQL 8.0。
1293 1
|
Oracle 关系型数据库 MySQL
Mysql(1)—简介及Windows环境下载安装
MySQL 是一个流行的关系型数据库管理系统(RDBMS),基于 SQL 进行操作。它由瑞典 MySQL AB 公司开发,后被 Sun Microsystems 收购,现为 Oracle 产品。MySQL 是最广泛使用的开源数据库之一,适用于 Web 应用程序、数据仓库和企业应用。
368 2
|
关系型数据库 MySQL Linux
Navicat 连接 Windows、Linux系统下的MySQL 各种错误,修改密码。
使用Navicat连接Windows和Linux系统下的MySQL时可能遇到的四种错误及其解决方法,包括错误代码2003、1045和2013,以及如何修改MySQL密码。
1671 0
|
SQL 关系型数据库 MySQL
"Python与MySQL的浪漫邂逅:一键掌握增删改查,开启你的数据库编程之旅!"
【8月更文挑战第21天】Python因其简洁的语法和强大的库支持,成为连接数据库的首选工具。本文介绍如何使用Python连接MySQL数据库并执行基本操作。首先需安装`mysql-connector-python`库。通过配置连接信息建立数据库连接后,可利用`cursor.execute()`执行SQL语句进行数据的增删改查,并通过`commit()`提交更改。查询时使用`fetchall()`或`fetchone()`获取结果。记得处理异常及关闭连接以释放资源。掌握这些基础,有助于高效进行数据库编程。
348 0

热门文章

最新文章

推荐镜像

更多