类的功能 Task (任务基类) 该类主要实现一个任务类 virtual int doWork() = 0; TaskQueue (任务队列) 该类主要针对任务的存储.删除.撤回等状态做管理 ThreadPool (线程池) 整个线程池的核心业务处理类 代码 Task.h //任务的基类 #pragma once #include <time.h> #include <atomic> //任务的基类 class Task { public: //构造.析构函数 Task():_id…
在这个多核时代,如何充分利用每个 CPU 内核是一个绕不开的话题,从需要为成千上万的用户同时提供服务的服务端应用程序,到需要同时打开十几个页面,每个页面都有几十上百个链接的 web 浏览器应用程序,从保持着几 t 甚或几 p 的数据的数据库系统,到手机上的一个有良好用户响应能力的 app,为了充分利用每个 CPU 内核,都会想到是否可以使用多线程技术.这里所说的"充分利用"包含了两个层面的意思,一个是使用到所有的内核,再一个是内核不空闲,不让某个内核长时间处于空闲状态.在 C++98 …
前言 在这个多核时代,如何充分利用每个 CPU 内核是一个绕不开的话题,从需要为成千上万的用户同时提供服务的服务端应用程序,到需要同时打开十几个页面,每个页面都有几十上百个链接的 web 浏览器应用程序,从保持着几 t 甚或几 p 的数据的数据库系统,到手机上的一个有良好用户响应能力的 app,为了充分利用每个 CPU 内核,都会想到是否可以使用多线程技术.这里所说的“充分利用”包含了两个层面的意思,一个是使用到所有的内核,再一个是内核不空闲,不让某个内核长时间处于空闲状态.在 C++98 的时…
dbproxy 是我业余采用C++11编写的跨平台代理服务器(并使用lua和自己的网络库),以扩展系统负载,同时使用多个后端数据库,后端数据库支持redis和ssdb. 需要由用户自己编写lua脚本控制sharding.测试效率比codis略高,且占用更少的CPU和内存. 下面是github上的readme,我直接拷贝下来: 介绍 dbproxy是一个采用C++11编写的代理服务器,支持redis和 ssdb数据库. 其主要用于扩容和提高系统负载.使用lua控制sharding,把不同的key-…
要实现 Signal-Slot,Signal 类中应该拥有一个保存 std::function 的数组: template<class FuncType> class Signal { public: std::vector<std::function<FuncType>> functionals; }; 接下来将会按照下图中可能出现的问题设计 Signal-Slot: 1.当对象 A 被摧毁时,funcA 应该自动从 vector 中移除. 要实现自动管理操作,最好的…
了解 QT 的应该知道,QT 有一个信号槽 Singla-Slot 这样的东西.信号槽是 QT 的核心机制,用来替代函数指针,将不相关的对象绑定在一起,实现对象间的通信. 考虑为 Simple2D 添加一个类似的信号槽,实现对象间的通信.当然,功能比较简单,不过对于 Simple2D 就足够了.最终的使用看起来像是这样的: class A { public: void FuncA(int v1, float v2, std::string str) { log("A: --%d--%f--%s-…
一:概述 C++11引入了thread类,大大降低了多线程使用的复杂度,原先使用多线程只能用系统的API,无法解决跨平台问题,一套代码平台移植,对应多线程代码也必须要修改.现在在C++11中只需使用语言层面的thread可以解决这个问题. 所需头文件<thread> 二:构造函数 1.默认构造函数 thread() noexcept一个空的std::thread执行对象 2.初始化构造函数 template<class Fn, class... Args>explicit thre…
一个简单的使用线程的Demo c++11提供了一个新的头文件<thread>提供了对线程函数的支持的声明(其他数据保护相关的声明放在其他的头文件中,暂时先从thread头文件入手吧),写一个多线程的程序需要引用这个新的头文件: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include <iostream> #include <thread>   void fun() {    std::cout << "A new thr…
预备知识 源IP地址和目的IP地址 IP地址在上一篇博客中也介绍过,它是用来标识网络中不同主机的地址.两台主机进行通信时,发送方需要知道自己往哪一台主机发送,这就需要知道接受方主机的的IP地址,也就是目的IP地址,因为两台主机是要进行通信的,所以接收方需要给发送方进行一个响应,这时接收方主机就需要知道发送方主机的IP地址,也就是源IP地址.有了这两个地址,两台主机才能够找到对端主机. 源IP地址: 发送方主机的IP地址,保证响应主机"往哪放" 目的IP地址: 接收方主机的IP地址,保证…
不想多说什么,会搜这些东西的都是想看代码的吧. 一开始不熟悉多线程的时候还在想怎么来控制一个线程的结束,后来发现原来有pthread_exit()函数可以直接在线程函数内部调用结束这个线程. 开始还想初始化一个pthread_t thread_fd[MAX]数组来存储开启的线程,然后用一个栈存储那些未分配的数组元素(thread_fd[index]=0)的index,跟缓存的思维相似,不过实在是想多了. 废话不多说,直接上代码,服务器和客户端都已经编译通过,正常运行,有基本的容错能力,不过也只是…
前面两节,说明了右值引用和它的作用.下面通过一个string类的编写,来说明右值引用的使用. 相对于C++98,主要是多了移动构造函数和移动赋值运算符. 先给出一个简要的声明: class String { public: String(); String(const char *s); //转化语义 String(const String &s); String(String &&s); ~String(); String &operator=(const String…
原文地址 Vue.js 是一套构建用户界面的渐进式框架.我们可以使用简单的 API 来实现响应式的数据绑定和组合的视图组件. 从维护视图到维护数据,Vue.js 让我们快速地开发应用.但随着业务代码日益庞大,组件也越来越多,组件逻辑耦合严重,使代码维护变得十分困难. 同时,Vue.js 的接口和语法十分自由,实现同一功能有若干种方法.每个人解决问题的思路不一样,写出来的代码也就不一样,缺乏团队内的规范. 本文旨在从组件开发的不同方面列举出合理的解决方法,作为建立组件规范的一个参考. 导航 构成组…
package com.hanqi.yzljs; public class yzljs { public static void main(String[] args) {     final double PI = 3.1415926;     double r =3.0;     double c =2*PI*r;     double s = PI*r*r;     System.out.println("圆的周长="+c+"    圆的面积="+s); }…
下面是一个  多进程 服务器的创建 import socket import re import multiprocessing def service_client(new_socket): """为这个客户端返回数据""" # 1. 接收浏览器发送过来的请求 ,即http请求 # GET / HTTP/1.1 # ..... request = new_socket.recv(1024).decode("utf-8") #…
前言 在这个多核时代,如何充分利用每个 CPU 内核是一个绕不开的话题,从需要为成千上万的用户同时提供服务的服务端应用程序,到需要同时打开十几个页面,每个页面都有几十上百个链接的 web 浏览器应用程序,从保持着几 t 甚或几 p 的数据的数据库系统,到手机上的一个有良好用户响应能力的 app,为了充分利用每个 CPU 内核,都会想到是否可以使用多线程技术.这里所说的“充分利用”包含了两个层面的意思,一个是使用到所有的内核,再一个是内核不空闲,不让某个内核长时间处于空闲状态.在 C++98 的时…
说到多线程编程,那么就不得不提并行和并发,多线程是实现并发(并行)的一种手段.并行是指两个或多个独立的操作同时进行.注意这里是同时进行,区别于并发,在一个时间段内执行多个操作.在单核时代,多个线程是并发的,在一个时间段内轮流执行:在多核时代,多个线程可以实现真正的并行,在多核上真正独立的并行执行.例如现在常见的4核4线程可以并行4个线程:4核8线程则使用了超线程技术,把一个物理核模拟为2个逻辑核心,可以并行8个线程. 并发编程的方法 通常,要实现并发有两种方法:多进程和多线程. 多进程并发 使用…
看用python写网络爬虫第一课之编写可复用的下载模块的视频,发现和<用Python写网络爬虫>一书很像,写了点笔记: #-*-coding:utf-8-*- import urllib2 #下载时遇到的错误经常是临时性的,比如服务器过载时返回的 503 Service Unavailable错误.对于此类错误,我们可以尝试重新下载 def download(url, num_retries = 2): #默认重试次数为2次 print "Downloading:", ur…
在Ubuntu下用eclipse cdt编写了一个多线程程序,但是总是出现pthread_create函数未定义! 查找了下原因,原来是要对eclipse进行一些简单的设置: 右键单击项目->Properties->(进行如下图所示的设置即可) 还有一种方式是:按照上图所示,找到GCC C++ Linker,点击其下面的Libraries标签,在右面对话框中加入pthread,然后点击ok按钮保存即可. 本篇文章来源于 Linux公社网站(www.linuxidc.com)…
说到多线程编程,那么就不得不提并行和并发,多线程是实现并发(并行)的一种手段.并行是指两个或多个独立的操作同时进行.注意这里是同时进行,区别于并发,在一个时间段内执行多个操作.在单核时代,多个线程是并发的,在一个时间段内轮流执行:在多核时代,多个线程可以实现真正的并行,在多核上真正独立的并行执行.例如现在常见的4核4线程可以并行4个线程:4核8线程则使用了超线程技术,把一个物理核模拟为2个逻辑核心,可以并行8个线程. 并发编程的方法 通常,要实现并发有两种方法:多进程和多线程. 多进程并发 使用…
摘要 本篇文章围绕以下几个问题展开: 进程和线程的区别 何为并发?C++中如何解决并发问题?C++中多线程的基本操作 同步互斥原理以及多进程和多线程中实现同步互斥的两种方法 Qt中的多线程应用 c++的多线程可以充分利用计算机资源,提高代码运行效率.在这里总结了一些多线程应用过程中的基本概念和用法.  一,进程和线程的区别 进程是一个应用程序被操作系统拉起来加载到内存之后从开始执行到执行结束的这样一个过程.简单来说,进程是程序(应用程序,可执行文件)的一次执行.比如双击打开一个桌面应用软件就是开…
java 多线程例子   编写具有多线程能力的程序经常会用到的方法有: run(), start(), wait(), notify(), notifyAll(), sleep(), yield(), join() 还有一个重要的关键字:synchronized 本文将对以上内容进行讲解. 一:run() 和start() 示例1: public class ThreadTest extends Thread {public void run() {for (int i = 0; i < 10;…
第一章 线程安全的对象生命期管理 第二章 线程同步精要 第三章 多线程服务器的适用场合与常用编程模型 第四章 C++多线程系统编程精要 1.(P84)11个常用的最基本Pthreads函数: 2个:线程的创建和等待结束(join).封装为muduo::Thread 4个:mutex的创建.销毁.加锁.解锁.封装为muduo::MutexLock 5个:条件变量的创建.销毁.等待.通知.广播.muduo::Condition 2.(P85)不推荐使用读写锁的原因是它往往造成提高性能的错觉(允许多个…
项目需求 整体思路 网络通信 字符解析 数据存储与查询 1 存储管理 2 数据查询 多线程 待改进未实现的想法 GitHub源代码 项目需求 设计一个基于Socket或基于HTTP的server,服务内容是提供一种简单的key/value映射关系的管 理与查询 以下的全部操作都是通过结构体Node来传递的: struct Node { char key[KEY_SIZE]; char value[VALUE_SIZE]; }; 本场景中须要client和server两个程序 client端仅仅有…
转自: https://www.cnblogs.com/llguanli/p/8732481.html Boost教程: http://zh.highscore.de/cpp/boost/ 本章目的: 当Android用ART虚拟机替代Dalvik的时候,为了表示和Dalvik彻底划清界限的决心,Google连ART虚拟机的实现代码都切换到了C++11.C+11的标准规范于2011年2月正式落稿.而此前10余年间,C++正式标准一直是C++98/03[①].相比C++98/03.C++11有了非…
GDB:从单线程调试到多线程调试 1. 裸跑GDB 1.1 安装GDB sudo apt-get install gdb 1.2 编译程序 由于需要调试,因此编译的时候需要添加-g编译参数: 1.3 GDB调试运行 1.4 常用调试参数 进入上面那个界面以后,说明正常启动GDB了,目前只是GDB启动了,程序还没有跑起来,输入run可以让程序跑起来,但是这样程序就直接执行结束了,没有被逐行调试,没什么意义,因此通常需要先打断点,再启动程序.下面先列出常用的命令: 命令 简写形式 说明 list l…
http://blog.csdn.net/morewindows/article/details/7392749 系列前言 本系列是本人参加微软亚洲研究院,腾讯研究院,迅雷面试时整理的,另外也加入一些其它IT公司如百度,阿里巴巴的笔试面试题目,因此具有很强的针对性.系列中不但会详细讲解多线程同步互斥的各种“招式”,而且会进一步的讲解多线程同步互斥的“内功心法”.有了“招式”和“内功心法”,相信你也能对多线程挥洒自如,在笔试面试中顺利的秒杀多线程试题. ----------------------…
Java的多线程 简单入门 首先能够先搞清楚什么是程序.进程.线程,以及它们之间的关系: 定义: 一 程序仅仅是一组指令的有序集合.它是静态的 二 进程是具有一定独立功能的程序关于某个数据集合上的一次执行活动,是系统进行资源分配和调度的一个独立单位. 三 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立执行的基本单位.线程自己基本上不拥有系统资源,仅仅拥有一点在执行中不可缺少的资源(如程序计数器,一组寄存器和栈),一个线程能够创建和撤销还有一个线程: 进程与线程差别与联…
前言 C++11之前我们使用线程需要系统提供API.posix线程库或者使用boost提供的线程库,C++11后就加入了跨平台的线程类std::thread,线程同步相关类std::mutex.std::lock_guard.std::condition_variable.std::atomic以及异步操作相关类std::async.std::future.std::promise等等,这使得我们编写跨平台的多线程程序变得容易,线程的一个高级应用就是线程池,使用线程池可以充分利用多核CPU的并行…
打算法比赛有点累,比赛之余写点小项目来提升一下工程能力.顺便陶冶一下情操 本来是想买一个服务器写个博客或者是弄个什么FQ的东西 最后刷知乎看到有一个很有意思的项目,就是维护一个「高可用低延迟的高匿IP代理池」 于是就想自己把这个项目写一次,其中有些更改,有些没有实现 (数据结构作业要写广义表,写项目时发现还没写 :) 原知乎链接:https://www.zhihu.com/question/47464143 (作者:resolvewang) 原项目github链接:https://github.…
曾经多少次想要在内核游荡?曾经多少次茫然不知方向?你不要再对着它迷惘,让我们指引你走向前方-- 内核编程常常看起来像是黑魔法,而在亚瑟 C 克拉克的眼中,它八成就是了.Linux内核和它的用户空间是大不相同的:抛开漫不经心,你必须小心翼翼,因为你编程中的一个bug就会影响到整个系统.浮点运算做起来可不容易,堆栈固定而狭小,而你写的代码总是异步的,因此你需要想想并发会导致什么.而除了所有这一切之外,Linux内核只是一个很大的.很复杂的C程序,它对每个人开放,任何人都去读它.学习它并改进它,而你也…