1.定义

2.作用

3.和进程的比较

4.多线程(multithreading)的优点和缺陷

5.调度(scheduling)

6.线程相关概念

定义

线程就是最小的可编程指令序列,是进程的子集。一个进程由一个或多个线程组成。

作用

线程的作用就是要加速程序的执行,提高计算机的性能,满足多任务需求。比如word,你可以编辑,同时语法检查也正在进行,至少就是两个线程了。再比如播放电影,视频线程和音频线程同时执行,同时有两种可能,一种是在多核cpu下,每个进程在不同的cpu,是真正的同时执行;另一种是单核cpu,这时可以采用time_sliced策略来实现同时的效果。

和进程的比较

process

thread

是否独立

独立

不独立,作为进程的子集存在

状态信息

更多

没进程多,一个进程的thread共享状态信息

是否有分隔的地址空间

没有

交互

process之间通过inter-process
communication
mechanisms来交互

thread之间的交互通过他们已经共享了的data,code,files

context switching速度

多线程的优点和缺陷

多线程主要用于多任务操作系统中,多线程作为一个广泛使用的编程和执行模型允许多个线程存在于一个单独的进程里。这些线程共享进程的资源,但是能够单独的执行任务。

多线程应用程序有以下优点:

(1)负责任:单线程程序,如果主进程被要执行很久的任务阻塞,那整个应用程序就卡死了。如果是多线程就不存在这个问题,多线程的话,让子线程来执行,就算这个子线程被阻塞了,其他子线程和主线程还可以等待用户输入。

(2)更快的执行:当有多个CPU或多核CPU的情况下,多线程就会是真正的同时执行(每个cpu执行一个thread),而不是time_sliced。

(3)更低的资源消耗:单进程多线程比多进程消耗的资源要少很多。比如,Apache就是利用多个listener
threads来监听请求和多个server
threads来处理请求。

(4)更好的系统利用:比如,一个文件系统用多线程可以达到更高的吞吐量和更低的延迟。因为在更快的中介(比如缓存)里的数据可以被一个线程获取,另外一个线程可以去低速中介(比如硬盘)获取数据而不需要等待其他线程完成操作。

(5)简化共享和交互:线程之间的通信主要通过它们已经共享的数据,代码和文件。

(6)平行化:通过处理让多个任务同时执行。

多线程的缺陷:

(1)同步的麻烦:因为一个进程的多个线程共享地址空间,程序员需要非常小心的来避免race
conditions和其他非直观的行为。为了正确的操作数据,多个线程通常需要及时集合来确保按正确的顺序来处理数据。

这个时候可能需要用锁(更多的用信号量,其实信号量可以看成是多个锁的集合)来阻止同一数据被同时修改或读取当这个数据正在被修改。

(2)一个线程摧毁一个进程:一个线程的非法操作会摧毁整个进程。

调度

操作系统调度线程的两种方式:

(1)抢占式多任务是优先选择的方式。它允许操作系统来决定什么时候切换上下文来让更重要的线程来获得cpu资源。抢占式多任务的缺点:当操作系统切换上下文的时候不合适时,可能会导致不好的结果,比如lock
convoy(多个优先级一样的线程重复竞争同一个锁)
和 priority
inversion(优先级低的线程抢到了cpu资源)。为了避免这个缺陷,于是就有了合作式多线程。

(2)合作式多线程。这个方式依赖于多线程自己来决定在什么点来放弃对cpu资源的控制。

显然,第一种调度方式,主导者是操作系统;第二种调度方式,主导者是多线程。

线程相关概念

green thread:被虚拟机调度的thread。

software thread:被操作系统调度的thread。

Thread学习的更多相关文章

  1. InnoDB master thread学习

    很久很久没有写博客了,工作比较忙,也没什么时间学习了,恰逢国庆放假,安心的学习一下,其实只是把之前学习过的知识再温习了一下而已.InnoDB 有众多的线程,其中非常核心的就是master thread ...

  2. thread学习笔记--BackgroundWorker 类

    背景: 在 WinForms 中,有时要执行耗时的操作,比如统计某个磁盘分区的文件夹或者文件数目,如果分区很大或者文件过多的话,处理不好就会造成“假死”的情况,或者报“线程间操作无效”的异常,或者在该 ...

  3. c++11: <thread>学习

    <thread>头文件中包含thread类与this_thread命名空间,下面逐一介绍. thread类 1. 构造函数 (1)默认构造函数 thread() noexcept; 默认构 ...

  4. Boost Thread学习笔记五

    多线程编程中还有一个重要的概念:Thread Local Store(TLS,线程局部存储),在boost中,TLS也被称作TSS,Thread Specific Storage.boost::thr ...

  5. Boost Thread学习笔记四

    barrierbarrier类的接口定义如下:  1 class barrier : private boost::noncopyable   // Exposition only 2 { 3 pub ...

  6. Boost Thread学习笔记三

    下面先对condition_impl进行简要分析.condition_impl在其构造函数中会创建两个Semaphore(信号量):m_gate.m_queue,及一个Mutex(互斥体,跟boost ...

  7. Boost Thread学习笔记二

    除了thread,boost种:boost::mutexboost::try_mutexboost::timed_mutexboost::recursive_mutexboost::recursive ...

  8. Boost Thread学习笔记

    thread自然是boost::thread库的主 角,但thread类的实现总体上是比较简单的,前面已经说过,thread只是一个跨平台的线程封装库,其中按照所使用的编译选项的不同,分别决定使用 W ...

  9. thread 学习

    #include <thread> #include <cstdio> #include <utility> #include <iostream> v ...

随机推荐

  1. Windows下Vim设置

    进入安装目录,找到_vimrc文件,用文本编辑器打开,在前面加入下述内容 设置中文支持 " 设置编码自动识别, 中文引号显示 " set fileencodings=utf-8,c ...

  2. mssql查找备注(text,ntext)类型字段为空的方法

    在sql语句中,如果查找某个文本字段值为空的,可以用select * from 表 where 字段='' ,但是如果这个字段数据类型是text或者ntext,那上面的sql语句就要出错了. 解决办法 ...

  3. apache开源项目--Shiro

    安全是企业应用中不可缺少的功能,在众多权限框架中,Shiro(其前身是JSecurity)因其简单而又不失强大的特点引起了不少开发者的注 意.随着Grails的关注度越来越高,在Grails社区也出现 ...

  4. Spring Bean之间的关系

    bean之间的关系:继承和依赖继承bean的配置 Spring允许继承bean的配置,被继承的bean称为父bean,继承这个父bean的bean称为子bean 子bean从父bean中继承配置,包括 ...

  5. 研究一家公司 z

    第一部分:确定一家公司的“质地”(描绘一家公司的总体印象)              1.1 天花板       天花板是指企业或行业的产品(或服务)趋于饱和.达到或接近供大于求的状态.在进行投资之前 ...

  6. 10、Android数据存储

    课程目标: 掌握Android中数据存储的几种方式 熟练使用PreferenceActivity&PreferenceScreen做专业的Setting功能 熟练使用SQLite3来存储数据 ...

  7. 黑盒测试用例设计方法&理论结合实际 -> 场景法

    一概念 现在的软件几乎都是用事件触发来控制流程的,事件触发时的情景便形成了场景,而同一事件不同的触发顺序和处理结果就形成事件流.这种在软件设计方面的思想也可以引入到软件测试中,可以比较生动地描绘出事件 ...

  8. NOIP2014 联合权值

    2.联合权值 (link.cpp/c/pas) [问题描述] 无向连通图G有n个点,n-1条边.点从1到n依次编号,编号为i的点的权值为Wi  ,每条边的长度均为1.图上两点(u, v)的距离定义为u ...

  9. jquery 资料收集

    1.jquery 特效:http://www.yeshou-jquery.com/yeshou/jquery.html 2.jquery 无缝文字滚动效果(跑马灯效果)插件 Marquee(MSCla ...

  10. 【转】开源C/C++网络库比较

    在开源的C/C++网络库中, 常用的就那么几个, 在业界知名度最高的, 应该是ACE了, 不过是个重量级的大家伙, 轻量级的有libevent, libev, 还有 Boost的ASIO. ACE是一 ...