POSIX多线程—概述
作者:阿波
链接:http://blog.csdn.net/livelylittlefish/article/details/7918110
(整半年没有更新,发几篇以前的读书笔记。)
Content
1. 基础概念
2. 线程安全
3. 可重入
4. 并发系统基本功能
1. 基础概念
线程
- 进程里执行代码的部分;
- 包含一系列机器指令所必须的机器状态,包括当前指令位置(一般为PC寄存器)、栈顶指针SP、通用寄存器、地址和数据寄存器等。
- 线程不包括进程中的其他数据,如地址空间和文件描述符;
进程
- 线程加上地址空间、文件描述符和其他数据。
- 一个进程中的所有线程共享文件和地址空间,包括程序段、数据段和堆栈;
既然线程和进程都需要地址空间、文件描述符等,那么区别何在?
- 多个线程可以共享一个地址空间,而做不同的事情。
- 在多处理器系统中,一个进程中的多个线程可以同时做不同的工作。
- 系统在线程间切换比在进程间切换快得多;
- 每一个进程有独立的虚拟地址空间,但同一个进程中的线程共享相同的地址空间和其他进程数据;
pthreads可以以一种优雅、高效、可移植的方式完成工作。
此处指是简单一句话总结线程和进程,实际上其定义此处完整。
异步(asynchronous):事情相互独立地发生,除非有强加的依赖性。任何两个彼此独立运行的操作都是异步的。
异步的复杂性
- 如果没有同时执行多个活动,那么异步就没有优势;
- 如果开始了一个异步活动,然后什么也不做就等待他结束,则并没有从异步获得好处。
并发(concurrency):事情同时发生。
- 实际上可能是串行发生的事情好像同时发生一样;
- 并发描述的是单处理器系统中线程或进程的行为;
- 在POSIX中,并发的定义要求“延迟调用线程的函数不应该导致其他线程的无限期延迟”;
- 并发操作之间可能任意交错,导致程序相互独立的运行(一个程序不必等到另一个程序结束后才开始运行),但并发并不代表操作同时进行。
并行(parallelism):指并发序列同时执行。指事情在相同的方向上独立进行(没有交错);
并发与并行
- 真正的并行只能在多处理器系统中存在;
- 但并发可以在单处理器系统和多处理器系统中都存在;
- 并发能在单处理器系统中存在是因为并发实际上是并行的假象;
- 并行则要求程序能够同时执行多个操作;
- 而并发只要求程序能够假装同时执行多个操作;
2. 线程安全
什么是线程安全?
- 定义:指代码能够被多个线程调用而不会产生灾难性后果;
- 特点:不要求代码在多个线程中高效的运行,只要求能够安全地运行;
实现线程安全的工具
- pthreads互斥量、条件变量、线程私有数据;
如何实现线程安全?
- 一般方法
- 对不需要保存永久状态的函数,通过整个函数调用的串行化实现;
- 比如,进入函数时加锁,退出函数时解锁;
- => 函数可以被多个线程调用,但一次只能有一个线程调用该函数;
- 更有效的方式
- 将线程安全函数分为多个小的临界区;
- => 允许多个线程进入该函数,但不能同时进入一个临界区;
- 更好的方式
- 将代码改造为对临界对象(数据)的保护而非对临界代码的保护;
- => 可使不同时访问相同临界数据的线程完全并行的执行;
3. 可重入
可重入
- 有时用来表示有效的线程安全,即通过采用比将函数或库转换成一系列区域更为复杂的方式使代码成为线程安全的;
- 可重入的函数应该避免依赖任何静态数据,最好避免依赖线程间任何形式的同步;
- 互斥量和线程私有数据可以实现线程安全,但通常需要改变接口来使函数可重入;
举例
- pthreads为了使readdir()函数可重入,增加readdir_r()函数,并在该函数内避免任何锁操作;
- 让调用者在搜索目录时分配一个数据结构来保存readdir_r()的环境;
特点:这种方式只有调用者才知道数据如何使用;
4. 并发系统基本功能
基本功能
- 执行环境:是并发实体的状态;提供建立、删除、维护环境的方式;
- 调度:决定在某个给定时刻该执行哪个环境,并在不同的环境中切换;
- 同步:为并发执行的环境提供协调访问共享资源的机制;
什么是同步?——让线程协调地完成工作的机制;
同步的实现方式
- 互斥量
- 条件变量
- 信号量
- 事件
- 消息机制:管道/Socket/Posix消息队列
线程、互斥量、条件变量关系
- 线程是计算机中的可执行单元,是CPU调度单位;
- 互斥量和条件变量都是线程同步的手段;
- 互斥量阻止线程间发生不可预期的冲突;
- 一旦避免了冲突,条件变量让线程等待直到可以安全地执行;
Reference
http://www.cnblogs.com/NickyYe/archive/2008/12/01/1344802.html
POSIX多线程—概述的更多相关文章
- POSIX多线程
全文共分四部分: POSIX多线程—概述 POSIX多线程—异步编程举例 POSIX多线程—线程基本概念 POSIX多线程—互斥量概述 POSIX多线程—概述 Content 1. ...
- Pthread:POSIX 多线程程序设计【转】
转自:http://www.cnblogs.com/mywolrd/archive/2009/02/05/1930707.html#phtread_ref POSIX 多线程程序设计 Blaise ...
- 【JAVA多线程概述】
一.多线程概述 一个进程中至少有一个线程,每一个线程都有自己运行的内容,这个内容可以称为线程要执行的任务. 不能没一个问题都使用多线程,能使用单线程解决的问题就不要使用多线程解决. 使用多线程的弊端: ...
- Java多线程-Java多线程概述
第一章 Java多线程概述 线程的启动 线程的暂停 线程的优先级 线程安全相关问题 1.1 进程与线程 进程:可以将运行在内存中的程序(如exe文件)理解为进程,进程是受操作系统管理的基本的运行单元. ...
- posix多线程--线程取消
1.三种取消状态Off 禁用取消Deferred 推迟取消:在下一个取消点执行取消Asynchronous 异步取消:可以随时执行取消 in ...
- posix多线程--三种基本线程编程模型
本文介绍了三种构建线程解决方案的方式. 一.流水线:每个线程执行同一种操作,并把操作结果传递给下一步骤的线程. 代码示例如下:终端输入一个int值,每个线程将该值加1,并将结果传给下一个线程. #in ...
- posix多线程--条件变量
条件变量是用来通知共享数据状态信息的. 1.条件变量初始化两种方式:(1)静态初始化pthread_cond_t cond = PTHREAD_COND_INITIALIZER;代码示例如下: #in ...
- posix多线程--互斥量
多线程程序在线程间共享数据时,如果多个线程同时访问共享数据就可能有问题.互斥量是解决多个线程间共享数据的方法之一. 1.互斥量初始化两种方式:(1)静态初始化 #include <pthread ...
- POSIX 多线程编程及理解
最近开发基于ZYNQ的嵌入式linux程序,涉及到多线程使用,将一些内容整理如下: POSIX多线程编程最为基础和重要的可以分为两部分: 线程操作-Thread Management 线程同步-Syn ...
随机推荐
- firewalld 防火墙 nat 网络地址转换
目的:实现以下效果 一. 准备环境 @1 三台虚拟机 @2 client 端 ip 192.168.1.2 server端 两块网卡 , ip 分别是 192.168.1.1 和 ...
- python模块之 paramiko(转载)
paramiko模块提供了ssh及sft进行远程登录服务器执行命令和上传下载文件的功能.这是一个第三方的软件包,使用之前需要安装. 1 基于用户名和密码的 sshclient 方式登录 # 建立一个s ...
- 【bzoj4592】[Shoi2015]脑洞治疗仪
由于脑洞的序列不会改变,考虑用线段树维护区间内sum,左边0的个数,右边0的个数,区间内最大脑洞.对于查询l~r最大脑洞可以将l~r分成logn个区间,总复杂度O(nlogn). #include&l ...
- HNOI模拟 Day3.23
一.拓扑(top)[ 题目描述]:给你一个有向二分图,求他的拓扑序列的个数.[ 输入]:第一行两个数 N,M,表示点数和边数.接下来 M 行每行两个数 a,b,表示 a 向 b 有一条有向边.[ 输出 ...
- 爬虫定时任务 redis 减轻 mysql 读的压力 加层
非工作时间,定时任务爬虫大量mysq短链接,影响了其他业务的,mysql 报 too many connections 错误 将爬虫url池放入到redis中,单独的脚本维护redis url池的更 ...
- commons-fileupload 组件实现文件上传
index.jsp 核心代码: //创建文件项工厂 DiskFileItemFactory factory = new DiskFileItemFactory(); //创建解析请求 数据的Servl ...
- HDU 5762Teacher Bo
Teacher Bo Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tota ...
- iOS10 优化APP首次安装网络权限提示方案
我刚经历了一场末日(停电),特别是在你想写文档的时候... 言归正传,今天的问题是解决iOS10系统下首次按钮APP弹出的网络权限提示所带来了问题以及优化. 起因 查了相关文章知道由于大陆工信部出台的 ...
- [Codeforces Round 486A] Fair
[题目链接] https://codeforces.com/contest/986/problem/A [算法] 用dist(i,j)表示第i种食物运到第j个城市需要的最小代价 将所有特产为第i中食物 ...
- 浅谈C++多态性(转载)
转载:http://blog.csdn.net/hackbuteer1/article/details/7475622 C++编程语言是一款应用广泛,支持多种程序设计的计算机编程语言.我们今天就会为大 ...