新建一个专门用于 EventLoop 的线程 实现:启动一个线程,在其中运行 EventLoop::loop() 功能:运行Evenloop 知识点 条件变量使用:当多个线程对同一个变量进行操作时使用条件变量对其进行保护,条件变量同互斥锁一同起作用。 代码及分析: EventLoopThread.h // Copyright 2010, Shuo Chen. All rights reserved. // http://code.google.com/p/muduo/ // // Use of this source code is governed by a BSD-style license // that can be found in the License file. // Author: Shuo Chen (chenshuo at chenshuo dot com) #include <muduo/net/EventLoop 继续阅读 >>


楚东方 18/03/11 21:35:14
为什么会出现线程池?   思考线程池问题时,我总是会和数据库连接池联想到一起,我个人觉得它们两者的核心思想有很大的相像之处,它们都是利用了一种"池化"的思想,目的都是为了减少连接的创建和销毁.  在多线程开发中,会因为线程数量多,而且很多时侯,每个线程仅仅执行一小段时间就会结束,所以我们需要频繁的创建线程,创建线程也是会消耗系统资源的,当需求很大时,有可能导致系统负载过重而直接崩溃掉.所以,我们就想要实现线程执行完后不用销毁,同时该线程还可以去执行其他任务,因此就出现了线程池。线程池?  什么是线程池呢?通俗易懂的说法--线程池实际上就是线程的池子,基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了很多未死亡的线程,池中线程执行调度由池管理器来处理。当有线程任务时,任务提交到线程池后,就会从线程池中直接寻找空闲的线程为之服务,执行完成后将线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。   在线程池的编程模式下,任务是提交给整个线程池,而不是直接交给某个线程,线程池 继续阅读 >>


董孟愿 18/03/06 21:20:24
源码地址:多线程爬虫–抓取淘宝商品详情页URL 项目地址中包含了一份README,因此对于项目的介绍省去部分内容。这篇博客,主要讲述项目的构建思路以及实现细节。 项目概述及成果 首先将本项目使用到技术罗列出来: MySQL数据库进行数据持久化及对宕机情况的发生做简单的处理 Redis数据库做IP代理池及部分已抓取任务的缓存 自制IP代理池 使用多线程执行任务(同步块,读写锁,等待与通知机制,线程优先级) HttpClient与Jsoup的使用 序列化与反序列化 布隆过滤器 之后会对其中使用到的技术进行详细的解释。 本项目如README中所述,还有许多不完善的地方,但IP代理池与任务抓取线程之间的调度与协作基本已无问题。也就是说,在此项目的框架上,如果你想修改其中代码用作其他抓取任务,也是完全可以的。我抓取到的数据所保存的源文件也放在GitHub的README上供大家免费浏览与下载(近90000的商品ID)。 整体思路 首 继续阅读 >>


董恒毅 18/03/02 22:35:30
线程的创建创建线程具体来说有三种方式,详细内容如下文.继承Thread类详细步骤:1.定义Thread类的子类,并重写该类的run()方法,run()方法被称为线程执行体.2.创建Thread子类的实例,即创建线程对象.3.调用线程对象的start()方法启动该线程.代码示例:/** * Created by dongmengyuan on 18-2-21. */ public class FirstThread extends Thread { //i是FirstThread的实例属性,不是局部变量 private int i; //重写run()方法,run()方法的方法体是线程执行体 public void run() { for( ; i < 100; i++) { //当线程使用继承Thread类时,直接使用this就可以获取当前线程 //Thread对象的getName()返回当前线程 继续阅读 >>


董孟愿 18/02/22 12:45:53
线程 #include<thread> 线程的几个重要函数 thread t(func); join(); detach(); get_id(); hardware_concurrency(); 创建一个线程并等待子线程 /************************************************************************* > File Name: test.cpp > Author: chudongfang > Mail: ************************************************************************/ #include<iostream> #include<thread> using namespace std; void func() { cout < 继续阅读 >>


楚东方 18/01/31 15:14:52
1.定义 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 2.关系 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行. 相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。 3.区别 进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切 继续阅读 >>


楚东方 17/12/21 23:48:08
#include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<pthread.h> #define COUNT 10 static int i = 1; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t even = PTHREAD_COND_INITIALIZER; pthread_cond_t uneven = PTHREAD_COND_INITIALIZER; //1 3 5 7 9 void* funA(void *arg) { while(i <= COUNT) { pthread_mutex_lock(&mutex); if(i % 2 != 0) { printf("funA 继续阅读 >>


李佳灏 17/12/10 19:06:37
作为被面试官最喜欢问到的23种设计模式之一,我们不得不熟练掌握单例模式以及洞悉多线程环境下,单例模式所存在的非线程安全问题以及它的解决方式。 注:这篇文章主要讲述多线程环境下单例模式存在的非线程安全问题,并不详细讲述单例模式。 何为单例模式 首先我们先大概了解一下单例模式的定义: 单例类只能有一个实例。 单例类必须自己创建自己的唯一实例。 单例类必须给所有其他对象提供这一实例。 单例模式的应用非常广泛,例如在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。选择单例模式就是为了避免不一致状态。 单例模式的实现有三种方式:饿汉式(天生线程安全),懒汉式,登记式(可忽略)。 对于上面单例模式的实现方式我在这里不做过多介绍,我们着重来看一下懒汉式在多线程环境下出现的问题以及它的解决策略。 设计线程安全的单例模式 D 继续阅读 >>


董恒毅 17/08/29 14:14:58
定位: 基于http,ftp协议的多线程下载工具,支持断点续传。 axel github代码:axel ubuntu16.04下载: apt-get install axel 使用方法: 1.man axel 2.axel -h axel -o target url 改目标文件名称 axel -s xx url 指定最大下载速度 axel -n x url 指定最大连接数 axel -N url 不使用代理服务器 axel -V 查看版本 axel -q url 不把信息输出到stdout axel -a url 显示不同的线程的进度和状态,和当前的速度并且显示剩余时间 axel -h 显示参数的大概信息 axel -v 一些状态信息 我想实现一个基于http协议的多线程断点续传工具。 目前先考虑多线程。 我的实现思路: 在此之前,需要一些http 继续阅读 >>


朱紫钰 17/08/15 16:24:14
线程池介绍 服务器完成一项任务的时间可分为:T1:创建线程或进程时间;T2:执行任务时间;T3:销毁进程或线程时间。通常T1+T3的时间大于T2,线程池正是关注如何缩短T1和T3的时间。 线程池通过在系统中预先创建一定数量的线程,当任务请求到来时从线程池中分一个预先创建的线程去处理任务,线程在处理完任务后还可以重用,不会销毁,继续等待下次任务的到开。这样能避免大量的线程创建和销毁操作,从而节省系统资源;同时有很多任务时,也会减少创建线程的数量。 用C++11的线程相关特性,比如线程、条件变量、互斥量,让我们编写并发程序更简单。 半同步半异步线程池实现的关键技术分析 线程池又三层组成: 1. 同步服务层:不断的将新任务添加到同步队列中,可以用多路复用或者多线程来完成。一开始没看懂任务是什么,其实一个函数就是一个任务,C++11通过std::function将函数封装为类模板对象,可以将这些任务(函数)放到容器中保存起来,以进行添加读取任务操作。 2. 排队层:就是一个同步队列,处于核心地位。所有待处理的任务都存在这里,要保证队列中共享数据线程安全 继续阅读 >>


杜肖孟 17/08/11 16:03:45