线程

学了C++不知道怎么搞后台开发?先看看这份学习路线吧!

♀尐吖头ヾ 提交于 2020-03-01 15:41:47
作者: AJ 在去年结束的秋季招聘中,后台开发或服务器开发的岗位需求一度火热,甚至超过了算法岗。不少同学从诸神黄昏的算法岗战场上退下,转向更偏向工程能力的后台开发岗,从而造成后台开发岗位竞争的大爆发。 后台开发工程师主流使用的编程语言有C++、Java、PHP以及目前慢慢流行的Golang等。本文就将以C++的角度,讲讲如何学习和准备后台开发的岗位。 一、语言基础 无论是C++开发还是Java开发,对于一个码农而言,最重要的就是对于编程语言的熟悉。同样,无论从事哪种类型的岗位,首当其冲的就是要掌握好语言基础。 C++是一门博大精深的编程语言,不仅拥有继承于C语言的过程化程序设计思想,还包含有面对对象(OOP)的设计理念。强大而又复杂。相对来说,C++的学习成本较高,语言里面的坑较多。语言基础的学习路线如下: 1 语法基础 重点掌握:(务必熟悉底层机制原理) 指针和引用的概念 指针与内存关系 程序编译过程 static、const、#define的用法和区别 C和C++区别 内存模型 内存中的栈和堆分配 2 面对对象基础 (务必熟悉底层机制原理) 面向对象理解 析构函数 构造函数 拷贝构造 多态 纯虚函数和虚函数 虚函数实现机制 虚函数表 访问限定符 public、private、protected 继承原理、虚继承、菱形继承 静态绑定和动态绑定 new/delete和malloc

多线程,协程,进程;并发,并行;异步;非阻塞;

时光总嘲笑我的痴心妄想 提交于 2020-03-01 15:35:34
进程: 是资源分配的最小单位; ² 调度由操作系统完成; ² 进程空间独立,数据安全性好,有专门的进程间通信方法 ² 进程的创建和删除要比线程消耗更多的计算机资源 ² 有独立的内存空间(上下文切换的时候需要保存栈、cpu寄存器、虚拟内存、以及打开的相关句柄等信息,开销大) 1、操作系统进行资源分配和调度的基本单位,多个进程之间相互独立 2、稳定性好,如果一个进程崩溃,不影响其他进程,但是进程消耗资源大,开启的进程数量有限制 线程: 是程序执行的最小单位(资源调度最小单位); ² 一个进程可以有多个线程,每个线程会共享父进程的资源(创建线程开销占用比进程小很多,可创建的数量也会很多) ² 线程的使用会给系统带来上下文切换的额外负担; ² 一个进程可以包含多个线程,线程共享进程的资源空间 1、CPU进行资源分配和调度的基本单位,线程是进程的一部分,是比进程更小的能独立运行的基本单位,一个进程下的多个线程可以共享该进程的所有资源 2、如果IO操作密集,则可以多线程运行效率高,缺点是如果一个线程崩溃,都会造成进程的崩溃 协程: ² 调度完全由用户控制; ² 一个线程(进程)可以有多个协程; ² 每个线程(进程)循环按照指定的任务清单顺序完成不同的任务(当任务被堵塞时,执行下一个任务;当恢复时,再回来执行这个任务;任务间切换只需要保存任务的上下文,没有内核的开销,可以不加锁的访问全局变量)

asyncio+aiohttp异步爬虫

こ雲淡風輕ζ 提交于 2020-03-01 15:14:01
概念 进程:进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。进程是操作系统动态执行的基本单元。 线程:一个进程中包含若干线程,当然至少有一个线程,线程可以利用进程所拥有的资源。线程是独立运行和独立调度的基本单元。 协程:协程是一种用户态的轻量级线程。协程无需线程上下文切换的开销,也无需原子操作锁定及同步的开销。 同步:不同程序单元为了完成某个任务,在执行过程中需靠某种通信方式以协调一致,称这些程序单元是同步执行的。 异步:为完成某个任务,不同程序单元之间过程中无需通信协调,也能完成任务的方式,不相关的程序单元之间可以是异步的。 多进程:多进程就是利用 CPU 的多核优势,在同一时间并行地执行多个任务。多进程模式优点就是稳定性高,因为一个子进程崩溃了,不会影响主进程和其他子进程,但是操作系统能同时运行的进程数是有限的。 多线程:多线程模式通常比多进程快一点,但是也快不到哪去,而且,多线程模式致命的缺点就是任何一个线程挂掉都可能直接造成整个进程崩溃,因为所有线程共享进程的内存。 Python 中使用协程最常用的库莫过于 asyncio ,然后我们还需要了解一些概念: event_loop 事件循环 程序开启一个无限循环,把一些函数注册到事件循环上,当满足事件发生的时候,调用相应的协程函数 coroutine 协程 协程对象,指一个使用async关键字定义的函数

MySQL主从复制(详细过程以及从库不能同步的解决办法)

非 Y 不嫁゛ 提交于 2020-03-01 15:10:30
前面已经在本地搭建了多个MySQL的实例,可以用这些实例进行主从复制。 主要是三个线程,主库上的binlog dump线程、从库I/O线程、从库SQL线程 端口3306的MySQL实例作为主服务器(master),端口3307、3308的MySQL实例作为从服务器(slave) 基本过程为: 1.启动主库并配置可以复制的用户 2. 启动从库(I/O线程),连接主库 3.当主库由相应操作时,保存二进制文件binlog,主库通过binlog dump线程发送给从库的I/O线程,I/O线程将binlog中的内容更新到relay log中去 4.从库上的SQL线程读取relay log中的语句并执行。 5.从库执行完毕之后,删除relay log,以免relay log太多占用磁盘空间 补充: 如果从库宕机恢复之后,从库如何知道宕机之前在复制到哪了? 从库会默认创建两个文件保存复制的进度:master.info、relay-log.info 关于完整的MySQL主从复制文档,可参见 官方文档 ,里面的步骤说的已经很详细了 1.在master的配置文件中, 在[mysqld]下开启log-bin功能,以及分配一个server-id (server-id官方文档给出的范围是1到 -1) [mysqld] server-id = 1 port=3306 socket=/tmp/mysql

ios 重温多线程 总结

梦想与她 提交于 2020-03-01 14:35:34
1> 无论使用哪种方法进行多线程开发,每个线程启动后并不一定立即执行相应的操作,具体什么时候由系统调度(CPU空闲时就会执行)。 2> 更新UI应该在主线程(UI线程)中进行,并且推荐使用同步调用,常用的方法如下: - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait (或者-(void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL) wait;方法传递主线程[NSThread mainThread]) [NSOperationQueue mainQueue] addOperationWithBlock: dispatch_sync(dispatch_get_main_queue(), ^{}) 3> NSThread适合轻量级多线程开发,控制线程顺序比较难,同时线程总数无法控制(每次创建并不能重用之前的线程,只能创建一个新的线程)。 4> 对于简单的多线程开发建议使用NSObject的扩展方法完成,而不必使用NSThread。 5> 可以使用NSThread的currentThread方法取得当前线程

iOS多线程编程技术NSThread; NSOperation、GCD三者使用详解

两盒软妹~` 提交于 2020-03-01 14:35:03
三种方式的优缺点介绍: 1)NSThread 优点: NSThread 比其他两个轻量级 缺点: 需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销 2)Cocoa NSOperation 优点: 不需要关心线程管理, 数据同步的事情,可以把精力放在自己需要执行的操作上。 Cocoa operation相关的类是NSOperation, NSOperationQueue. NSOperation是个抽象类,使用它必须用它的子类,可以实现它或者使用它定义好的两个子类: NSInvocationOperation和NSBlockOperation. 创建NSOperation子类的对象,把对象添加到NSOperationQueue队列里执行。 3) GCD (全优点) Grand Central dispatch(GCD)是Apple开发的一个多核编程的解决方案。在iOS4.0开始之后才能使用。GCD是一个替代NSThread, NSOperationQueue,NSInvocationOperation等技术的很高效强大的技术。 下面我用简单易于理解的代码实例来介绍NSThread在开发实践中的使用,具体使用时可以根据实际情况进行扩展: 一、NSThread的使用(基本已过时) [html] view plain copy #import < UIKit

多线程进阶——JUC并发编程之抽象同步队列AQS框架设计理念一探究竟🔥

独自空忆成欢 提交于 2020-03-01 13:46:10
1、学习切入点 既然AQS是一个提供给我们使用的框架,那么我们可以看看这个框架都有哪些类依赖它。 从框架来看, AQS定义了一套多线程访问共享资源的同步器框架 ,许多同步类实现都依赖于它,如常用的 ReentrantLock/Semaphore/CountDownLatch... 等。 现在看来我们还有点懵逼,这个框架具体是怎么设计的?下面我们翻看源码注释一探究竟!其中 AQS里面维护了一个Node节点构造的CLH队列(FIFO)先进先出队列 。 /** * <p>To enqueue into a CLH lock, you atomically splice it in as new * tail. To dequeue, you just set the head field. * <pre> * +------+ prev +-----+ +-----+ * head | | <---- | | <---- | | tail * +------+ +-----+ +-----+ * </pre> * * <p>Insertion into a CLH queue requires only a single atomic * operation on "tail", so there is a simple atomic point of * demarcation

SAP ABAP, Fiori, Android和Hybris里的异步操作

假如想象 提交于 2020-03-01 13:15:30
ABAP 其实ABAP的编程范式相对其他语言比较简单,没有太多异步操作。除了STARTING NEW TASK可以实现异步调用。 Use ABAP Multi-Thread programming to deal with a real performance issue: https://blogs.sap.com/2017/02/10/use-abap-multi-thread-programming-to-deal-with-a-real-performance-issue/ Fiori 我们做Fiori开发的时候,处理过performance的incident。一个simple operation的roundtrip number不能大于3。2个几乎同时发出的异步操作算1个roundtrip。Fiori的best practice也是尽量用异步操作。 Android 成都Android开发团队2011~2013参与了Customer Briefing app的开发。如果在UI线程里访问了web resource,容易遇到ANR Android Not response的exception。 我记得我当时编程时只要在UI线程做这些事情,API调用会立即报错。 Hybris 看Hybris log就知道了,Hybris服务end user请求通过一个线程池来完成

多线程

穿精又带淫゛_ 提交于 2020-03-01 13:12:32
1.线程和进程的区别和联系  进程的概念:进程是表示资源分配的基本单位,又是CPU调度运行的基本单位。  线程的概念:线程是进程中执行运算的最小单位,亦即执行处理机调度的基本单位。  联系: (1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位。 (2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。 同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。 (3)处理机分给线程,即真正在处理机上运行的是线程。 (4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。 (5)线程属于进程,不能独立执行。每个进程至少要有一个线程,成为主线程 区别: (1)进程是系统进行资源分配的基本单位,有独立的内存地址空间; 线程是CPU调度的基本单位,没有单独地址空间,有独立的栈,局部变量,寄存器, 程序计数器等。 (2)创建进程的开销大,包括创建虚拟地址空间等需要大量系统资源; 创建线程开销小,基本上只有一个内核对象和一个堆栈。 (3)一个进程无法直接访问另一个进程的资源;同一进程内的多个线程共享进程的资源。 (4)进程切换开销大,线程切换开销小;进程间通信开销大,线程间通信开销小

线程之线程同步

风流意气都作罢 提交于 2020-03-01 12:51:01
本文来自个人博客: https://dunkwan.cn 文章目录 线程同步 互斥量 函数`pthread_mutex_timedlock` 读写锁 带有超时的读写锁 条件变量 自旋锁 屏障 线程同步 互斥量 互斥量从本质上来说是一把锁,在访问共享资源前对互斥量进行设置,在访问完成后释放互斥量。互斥量使用 pthread_mutex_t 数据类型表示的。在使用互斥量以前,必须首先对它进行初始化,可以把它设置为常量 PTHREAD_MUTEX_INITIALIZER (只适用于静态分配的互斥量),也可以通过调用 pthread_mutex_init 函数进行初始化。如果动态分配互斥量(例如通过调用 malloc 函数),在释放内存前需要调用 pthread_mutex_detroy 。 # include <pthread.h> int pthread_mutex_init ( pthread_mutex_t * restrict mutex , const pthread_mutexattr_t * restrict attr ) ; int pthread_mutex_destroy ( pthread_mutex_t * mutex ) ; 两个函数的返回值:若成功,返回 0 ;否则,返回错误编号。 要用默认的属性初始化互斥量,只需把 attr 设为 NULL 。