文章目录前言进程概念线程概念地址空间通信手段调度和切换进程何时调度线程切换进程的创建过程fork 函数task_struct父子进程间的文件共享线程的实现一对一模型 (内核级线程) 1:1多对一模型 (用户级线程) M:1多对多模型 两级模型 M:N 前言 书本上的定义: 线程是调度的基本单位, 进程是资源分配的基本单位 应该大家都知道这个概念, 但是进程和线程之间的异同绝不仅仅是这一句话这么简单 进程概念 进程是由正文段 (存放被执行的机器指令), 用户数据段 (存放进程在执行时直接进行操作的所有数据, 包括进程使用的全部变量在内), 系统数据段 (存放程序运行的环境) 而这个所谓的系统数据段也正是进程中最重要的一部分, 它就是进程和程序的区别所在, 进程作为一个动态的程序实例, 这一部分就存放着进程的控制信息, 每个进程都有一个 task_strust 数据结构 (也就是 PCB) 来存放这些控制信息. 操作系统也是通过这些控制信息 (task_struct) 来控制调度所有进程的 线程概念 继续阅读 >>


吕子健 19/01/19 20:36:07
多个线程调用同一个对象中的不同名称的synchronized同步方法或synchronized(this)同步代码块时,调用的效果就是按顺序执行,也就是同步的,阻塞的. synchronized同步方法 对其他synchronized同步方法或synchronized(this)同步代码块调用呈阻塞状态 同一时间只有一个线程可以执行synchronized同步方法中的代码 synchronized(this)同步代码块 对其他synchronized同步方法或synchronized(this)同步代码块调用呈阻塞状态 同一时间只有一个线程可以执行synchronized(this)同步代码块中的代码 其实Java还支持对"任意对象"作为"对象监视器"来实现同步的功能. 这个任意对象大多数是实例变量及方法的参数 synchronized(非this对象x)同步代码块 在多个线程持有"对象监视器"为同一个对象的前提下,同一时间只有一个线程可以执行synchronized(非this对象 继续阅读 >>


贺含悦 18/12/26 22:31:44
Java中,想要创建一个线程池有两种方式,分别是使用Executors的工厂方法创建和直接使用ThreadPoolExecutor去创建一个线程池。 在阿里巴巴开发手册中有讲,在有多线程开发的需求时,强制使用线程池,避免因为“过度切换”而引起的资源耗尽问题,并且创建线程池时需通过ThreadPoolExecutor的方式去创建。原文如下: 【强制】线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。 说明:使用线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。 【强制】线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 说明:Executors返回的线程池对象的弊端如下: 1)FixedThreadPool和SingleThreadPool:   允许的请 继续阅读 >>


祝一迪 18/11/26 12:05:26
概述:什么是线程池?    因为程序边运行边创建线程是比较耗时的,所以我们通过池化的思想:在程序开始运行前创建多个线程,这样,程序在运行时,只需要从线程池中拿来用就可以了.大大提高了程序运行效率. 如何实现:    一般线程池都会有以下几个部分构成: 1. 线程池管理器(ThreadPoolManager):用于创建并管理线程池 2. 工作线程(WorkThread): 线程池中线程 3. 任务队列:用于存放没有处理的任务。提供一种缓冲机制。 4. 用于添加任务的接口  总的来讲,就是先创建几个线程,然后这些线程等待任务队列,不为空拿出任务执行即可(任务可以是对象,也可以是某个函数). 第一种实现: #ifndef _THREADPOOL_H #define _THREADPOOL_H #include <vector> #include <queue> #include <thread> #include <iostream> #include < 继续阅读 >>


刘生玺 18/11/10 22:57:15
文章目录创建线程std::thread 类使用join()使用 detach()警惕作用域线程不能复制给线程传参传递指针传递引用以类成员函数为线程函数以容器存放线程对象互斥量std::mutexstd::lock_guard条件变量call_once 创建线程 C++11 增加了线程以及线程相关的类, 而之前并没有对并发编程提供语言级别的支持 std::thread 类 使用 std::thread 类来创建线程, 我们需要提供的只是线程函数, 或者线程对象, 同时提供必要的参数 std::thread 表示单个执行的线程, 使用thread 类首先会构造一个线程对象, 然后开始执行线程函数, #include <iostream> #include <thread> //需要包含的头 using namespace std; void func(int a, double b) //有参数, 参数数量不限 { cout << a << ' 继续阅读 >>


吕子健 18/09/30 16:27:30
1. 为新线程传递参数 错误代码示例: for (i = 0; i < N; i++) { pthread_create(&tid, NULL, &handle, &i); } 当当当,要提问啦!!! 以上这段代码会发生什么奇怪的事情吗?当线程去进行处理i的时候,如果cpu调度到主线程运行,就会改变i的值。因为传入的是地址,所以线程中使用的i就会被改变。这就会出现问题。那么我们如何给线程传递参数呐?一般有以下两种方法: 1. 传送值而不传送地址 2. 通过`new,malloc`传递 1. 传送值而不传送地址 for (i = 0; i < N; i++) { pthread_create(&tid, NULL, &handle, (void *)i); } void *handle(void *arg) { int i = (int)arg; 。。。 retur 继续阅读 >>


刘生玺 18/09/27 23:41:07
为什么需要线程池 在生产环境中,我们不能无限制的创建线程,主要原因如下: 线程创建与销毁的代价并不低; 如果可运行的线程数量多于可用处理器的数量,有些线程将会闲置,大量闲置的线程会消耗系统资源(内存)并给垃圾收集器带来压力; 大量线程竞争CPU也会造成不小的性能开销。 Executor框架 Executor框架在Java 5中被引入,其内部使用了线程池机制。它在java.util.cocurrent包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。 Executor框架包括:线程池,Executor,Executors,ExecutorService等(Callable与Future本篇不进行讨论)。 Executor接口 我们先来了解一下其中的Executor接口: public interface Executor { void execute(Runnable command); } Executor接口的定义非常简单,但它却为灵活 继续阅读 >>


董恒毅 18/09/13 21:38:05
关于Java线程的状态网上的说法不一,有的说是6种状态,有的说是5中状态,索性就查看了一下Java源码。Thread类里面有一个枚举类,如下: public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED; } 这个枚举类里面有6种类型,所以Java中的线程有6种状态。 关于各种状态的简单说明: NEW(初始):线程被创建后尚未启动。 RUNNABLE(运行):包括了操作系统线程状态中的Running和Ready,也就是处于此状态的线程可能正在运行,也可能正在等待系统资源,如等待CPU为它分配时间片。 BLOCKED(阻塞):线程阻塞于锁。 WAITING(等待):线程需要等待其他线程做出一些特定动作(通知或中断)。 TIME_WAITING(超时等待):该状态不同于WAITING,它可以在指定的时间内自行返回。 TERMINATED(终止):该线 继续阅读 >>


李猛 18/08/15 08:19:50
并行与并发(测试2) 理解: 解释一:并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。 解释二:并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。 解释三:在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群 普通解释: 并发:交替做不同事情的能力 并行:同时做不同事情的能力 专业术语: 并发:不同的代码块交替执行 并行:不同的代码块同时执行 同步与异步 有两个线程在并发执行以下代码段, 其中 g 是 int 类型的全局变量。 请 问当两个线程都执行完毕该代码段后, g 的值的取值范围为50000-100000。 for (int i = 1; i <= 50000; i++) { g += 1; } 当多个控制线程共享内容的内存时,需要确保每个线程看到一致的数据视图。如果每个线程使用的变量都是其他线程不会读取和修改的,那么就不存在一致性的问题。但是,当一个线程可以修改的变量 继续阅读 >>


李高晋 18/08/12 21:34:38
线程这一章,着实不好理解,写上一篇博客时,我还没这么想, 今天做了几道关于线程的题,觉得还是不行呀,还是乖乖再来一遍吧。 私有数据: 线程同步 1、私有数据 为什么要有线程私有数据呢? 我们知道在多线程环境下,进程内的所有线程共享进程的数据空间,所以全局变量为所有线程共有,但是在程序设计的时候有时需要保存线程自己的全局变量,例如:变量errno:返回标准的错误码,errno不应该是一个局部变量,因为每个函数几乎都可以访问它,但它又不能作为一个全局变量,否则在一个线程里输出的可能是另一个线程的出错信息,那么,这种问题就可以通过创建线程的私有数据来解决。 线程私有数据:可以被此线程内的各个函数访问,但对其他线程是屏蔽的。 采用一键多值的技术,即一个键对应多个数值。 操作线程私有数据的函数主要有四个: (1)第一个 int pthread_key_create(pthread_key_t *key,void (*destr_function) (void 继续阅读 >>


刘甜 18/08/12 16:38:35