Thread学习
1.定义
2.作用
3.和进程的比较
4.多线程(multithreading)的优点和缺陷
5.调度(scheduling)
6.线程相关概念
定义
线程就是最小的可编程指令序列,是进程的子集。一个进程由一个或多个线程组成。
作用
线程的作用就是要加速程序的执行,提高计算机的性能,满足多任务需求。比如word,你可以编辑,同时语法检查也正在进行,至少就是两个线程了。再比如播放电影,视频线程和音频线程同时执行,同时有两种可能,一种是在多核cpu下,每个进程在不同的cpu,是真正的同时执行;另一种是单核cpu,这时可以采用time_sliced策略来实现同时的效果。
和进程的比较
|
process |
thread |
|
|
是否独立 |
独立 |
不独立,作为进程的子集存在 |
|
状态信息 |
更多 |
没进程多,一个进程的thread共享状态信息 |
|
是否有分隔的地址空间 |
有 |
没有 |
|
交互 |
process之间通过inter-process |
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学习的更多相关文章
- InnoDB master thread学习
很久很久没有写博客了,工作比较忙,也没什么时间学习了,恰逢国庆放假,安心的学习一下,其实只是把之前学习过的知识再温习了一下而已.InnoDB 有众多的线程,其中非常核心的就是master thread ...
- thread学习笔记--BackgroundWorker 类
背景: 在 WinForms 中,有时要执行耗时的操作,比如统计某个磁盘分区的文件夹或者文件数目,如果分区很大或者文件过多的话,处理不好就会造成“假死”的情况,或者报“线程间操作无效”的异常,或者在该 ...
- c++11: <thread>学习
<thread>头文件中包含thread类与this_thread命名空间,下面逐一介绍. thread类 1. 构造函数 (1)默认构造函数 thread() noexcept; 默认构 ...
- Boost Thread学习笔记五
多线程编程中还有一个重要的概念:Thread Local Store(TLS,线程局部存储),在boost中,TLS也被称作TSS,Thread Specific Storage.boost::thr ...
- Boost Thread学习笔记四
barrierbarrier类的接口定义如下: 1 class barrier : private boost::noncopyable // Exposition only 2 { 3 pub ...
- Boost Thread学习笔记三
下面先对condition_impl进行简要分析.condition_impl在其构造函数中会创建两个Semaphore(信号量):m_gate.m_queue,及一个Mutex(互斥体,跟boost ...
- Boost Thread学习笔记二
除了thread,boost种:boost::mutexboost::try_mutexboost::timed_mutexboost::recursive_mutexboost::recursive ...
- Boost Thread学习笔记
thread自然是boost::thread库的主 角,但thread类的实现总体上是比较简单的,前面已经说过,thread只是一个跨平台的线程封装库,其中按照所使用的编译选项的不同,分别决定使用 W ...
- thread 学习
#include <thread> #include <cstdio> #include <utility> #include <iostream> v ...
随机推荐
- poj2186Popular Cows(强连通分量)
http://poj.org/problem?id=2186 用tarjan算出强连通分量的个数 将其缩点 连成一棵树 则题目所求即变成求出度为0 的那个节点 在树中是唯一的 即树根 #includ ...
- [CF 471C] MUH and House of Cards
C. MUH and House of Cards Polar bears Menshykov and Uslada from the zoo of St. Petersburg and elep ...
- xml 实现圆形图 和 椭圆形图
1. 效果图 2.圆形图 <ImageView android:layout_width="wrap_content" android:layout_height=" ...
- 深入分析Cookie的安全性问题
Cookie的目的是为用户带来方便,为网站带来增值,一般情况下不会造成严重的安全威胁.Cookie文件不能作为代码执行,也不会传送病毒,它为用户所专有并只能由创建它的服务器来读取.另外,浏览器一般只允 ...
- jqGrid如何实现单选。
设置如下:multiselect:true // multi-select checkboxes appear multiboxonly:true // checkboxes act like rad ...
- PC端使用opencv获取webcam,通过socket把Mat图像传输到android手机端
demo效果图: PC端 android端 大体流程 android端是服务器端,绑定IP和端口,监听来自PC端的连接, pc端通过socket与服务器andorid端传输图片. 主要代码 andro ...
- MSP430F5438点亮led
今天只是想点亮一个led灯,因为没有视频,搞得很多的东西都是自己摸,下午本来讲和咨询店家,TMD说好给一点技术支持,结果一点也不给,我真想草泥马了,其实代码早就写出来了,只是哥哥不知道这款开发板还有接 ...
- C 语言控制台实现五子棋项目
花了一天时间实现了控制台五子棋项目,把项目贴上来.也算是告一段落了. 为了进一步了解C语言编程,熟悉优秀的编码风格,提升编码能力,丰富项目经验.所以在编程初期选择了控制台小游戏<单机五子棋> ...
- Fidder的几点补充
坦克兄写的Fiddler教程很好很详细 链接这里:http://www.cnblogs.com/TankXiao/archive/2012/02/06/2337728.html 补充一: Fiddle ...
- CDR绘制绚丽五角星※※
CDR绘制绚丽五角星 1.绘制一个五角星,在多边形工具下拉的第二个就是 2.选中五角星,点击颜色即可.给五角星加上颜色 3.用立体化工具进行延伸. 4.点击图形中心向下拉. 看到了中间的一个长方条了没 ...