当前位置:首页 >> 信息与通信 >>

linux多线程编程(中嵌教育-嵌入式linux开发课件)


linux多线程编程
1. 2.

Linux下 Linux下线程概述 linux线程 linux线程实现

www.chinaEDA.cn

1,Linux下线程概述
进程是系统中程序执行和资源分配的基 本单位.每个进程有自己的数据段,代码 段和堆栈段. 线程通常叫做轻型的进程.线程是在共 享内存

空间中并发执行的多道执行路径, 他们共享一个进程的资源. 因为线程和进程比起来很小,所以相对 来说,线程花费更少的CPU资源.
www.chinaEDA.cn

进程 用户地址空间

线程一

线程二

线程三

图1 进程与线程的关系
www.chinaEDA.cn

线程按照其调度者可分为用户级线程和内核级线 程两种. (1)用户级线程 主要解决的是上下文切换的问题,其调度算法和 调度过程全部有用户决定. (2)内核级线程 有内核调度机制实现. 现在大多数操作系统都采用用户级线程和内核级 线程并存的方法.用户级线程可与内核级线程实现 "一对一","一对多"的对应关系.
www.chinaEDA.cn

2,linux线程实现 , 线程实现
以下线程均为用户级线程.在linux中, 一般采用Pthread线程库实现线程的访问与 控制,由POSIX提出,具有良好的可移植性.

www.chinaEDA.cn

2.1 线程创建与退出
创建线程使用pthread_create函数.在线程 创建以后,就开始运行相关的线程函数.线程退 出时使用函数pthread_exit,是线程的主动行为. 注意进程退出时使用exit函数,线程中用 pthread_exit替代exit. 由于一个进程中的多个线程共享数据段,因 此通常在线程退出后,退出线程所占用的资源并 不会随线程结束而释放.所有需要pthread_join 函数来等待线程结束,类似于wait系统调用.
www.chinaEDA.cn

创建进程: #include <pthread.h> pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg) thread:线程标识符 attr:线程属性设置 start_routine:线程函数起始地址 arg:传递给start_routine的参数
www.chinaEDA.cn

进程退出: #include <pthread.h> pthread_exit( void *retval ) retval: pthread_exit调用者线程的返 回值,可由其他函数和pthread_join来检 测获取.

www.chinaEDA.cn

等待进程退出: #include <pthread.h> pthread_join( pthread_t *th,void **thread_return ) th:等待线程的标识符 thread_return:用户定义指针,用来存 储被等待线程的返回值 线程实例见:thread.c
www.chinaEDA.cn

2.2 修改线程属性
在thread_creat函数中有设置线程属性 参数,这些属性包括绑定属性,分离属性, 堆栈地址,堆栈大小,优先级.系统默认 属性为非绑定,非分离,缺省1M的堆栈, 与父进程同样级别的优先级. 分别介绍绑定属性和分离属性.

www.chinaEDA.cn

1,绑定属性 在linux系统中,可实现一个用户级线 程与一个内核级线程相对应的"一对一" 线程机制.绑定属性是指一个用户级线程 固定的分配给一个内核级线程.非绑定属 性则是指用户级线程与内核级线程的关系 不是始终固定的,而是由系统来控制分配.

www.chinaEDA.cn

2,分离属性 分离属性是用来决定一个线程以什么样 的方式来终止自己.在非分离情况下,当 一个线程结束时,它所占用的系统资源并 没有完全释放,也没有真正终止.只有当 pthread_join()函数返回时,该线程才释 放自己占用的资源.而在分离情况下,一 个线程结束时会立即释放它所占用的资源.
www.chinaEDA.cn

3,属性设置 属性设置是由一定函数来完成的,通常调用 pthread_attr_init函数进行初始化.设置绑定属 性的函数为pthread_attr_setscope,设置分离属性 的函数是pthread_attr_setdetachstate,设置线程 优先级的相关函数pthread_attr_getschdparm(获 取线程优先级)和pthread_attr_setschedparam (设置线程优先级).在设置完成属性后,调用 pthread_creat函数创建线程.

www.chinaEDA.cn

线程属性初始化: #include <pthread.h> int pthread_attr_init (pthread_attr_t *attr) attr:线程属性 返回值:成功0,错误-1.

www.chinaEDA.cn

设置绑定属性: #include <pthread.h> pthread_attr_setscope(pthread_attr_t *attr, init scope) attr:线程属性 scope:PTHREAD_SCOPE_SYSTEM(绑定) PTHREAD_SCOPE_PRCESS(非绑定) 返回值:成功0,错误-1.
www.chinaEDA.cn

设置分离属性: #include <pthread.h> pthread_attr_setsetdetachstate(pthread_at tr_t *attr, init detachstate) attr:线程属性 detachstate :PTHREAD_CREAT_DETACHED(分离) PTHREAD_CREAT_JOINABLE(非分离) 返回值:成功0,错误-1.
www.chinaEDA.cn

获取线程优先级: #include <pthread.h> int pthread_attr_getschedparam (pthread_attr_attr *attr, struct sched_param *param) attr:线程属性 param:线程优先级 返回值:成功0,错误-1.
www.chinaEDA.cn

设置线程优先级: #include <pthread.h> int pthread_attr_setschedparam (pthread_attr_attr *attr, struct sched_param *param) attr:线程属性 param:线程优先级 返回值:成功0,错误-1. 线程实例见:pthread.c
www.chinaEDA.cn

2.3 mutex互斥锁线程控制 互斥锁线程控制
mutex是一种简单的加锁的方法来控制 对共享资源的访问.在同一时刻只能有一 个线程掌握某个互斥上的锁,拥有上锁状态 的线程能够对共享资源进行访问.若其他 线程希望上锁一个已经被上了互斥锁的资 源,则该线程挂起,直到上锁的线程释放 互斥锁为止.

www.chinaEDA.cn

互斥锁的操作主要包括以下几个步骤:
互斥锁初始化:pthread_mutex_init 互斥锁上锁:pthread_mutex_lock 互斥锁判断上锁:pthread_mutex_trylock 互斥锁解锁:pthread_mutex_unlock 消除互斥锁:pthread_mutex_destroy

www.chinaEDA.cn

互斥锁可分为以下三种:
快速互斥锁: 递归互斥锁: 检错互斥锁: 这三种锁的主要区别在于其他未占有互斥锁的 线程在希望得到互斥锁时是否需要阻塞等待.
快速互斥锁是指调用线程会阻塞直到拥有互斥锁的线 程释放为止. 递归互斥锁能够成功返回并且增加调用线程在互斥上 加锁的次数. 检错互斥锁则为快速互斥锁的阻塞版本,他会立即返 回并得到一个错误.
www.chinaEDA.cn

互斥锁初始化:
#include <pthread.h> int pthread_mutex_init( pthread_mutex_t *mutex, const pthread_mutex_attr_t *mutexattr) Mutex:互斥锁

Mutexattr:PTHREAD_MUTEX_INITIALIZER: 创建快速互斥锁 PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP: 创建递归互斥锁 PTHREAD_REEORCHECK_MUTEX_INITIALIZER_NP: 创建检错互斥锁
www.chinaEDA.cn

互斥锁操作: #include <pthread.h> int pthread_mutex_lock(pthread_mutex_t *mutex) int pthread_mutex_trylock(pthread_mutex_t *mutex) int pthread_mutex_unlock(pthread_mutex_t *mutex) int pthread_mutex_destroy(pthread_mutex_t *mutex) Mutex:互斥锁 返回值:成功0,错误-1. 互斥锁实例见:mutex.c
www.chinaEDA.cn

2.4 信号量线程控制
信号量也就是操作系统中所用到的PV操作, 它广泛用于进程或线程间的互斥与同步. PV操作是对整数计数器信号量sem的操作.一 次P操作使sem减一,一次V操作使sem加一. 用于互斥时,几个进程(或线程)往往只设 置一个信号量sem. 用于同步时,往往设置多个信号量,并安排 不同的值了来实现它们之间的顺序执行.

www.chinaEDA.cn

开始

初始化信号量

P操作

P操作

线程一执行

线程二执行

V操作

V操作

结束

图2 信号量互斥操作
www.chinaEDA.cn

开始

初始化信号量

P操作sem1

P操作sem2

线程一执行

线程二执行

V操作sem2

V操作sem1

结束

图3 信号量同步操作
www.chinaEDA.cn

Linux实现了POSIX.1的无名信号量, Linux实现了POSIX.1的无名信号量,用于 实现了POSIX.1的无名信号量 线程的同步与互斥.信号量操作函数: 线程的同步与互斥.信号量操作函数:
sem_init:用于创建一个信号量,并初始化它. sem_init:用于创建一个信号量,并初始化它. 用于创建一个信号量 sem_wait或sem_trywait: 相当于P操作,它们 sem_wait或 相当于P操作, 都能使信号量减一, 都能使信号量减一,两者区别在于当信号量小 于零时,sem_wait会阻塞 会阻塞, sem_trywait则 于零时,sem_wait会阻塞,而sem_trywait则 会立即返回. 会立即返回. sem_post:相当于 操作, 相当于V sem_post:相当于V操作,它将信号量的值加一 同时发出信号唤醒等待的进程. 同时发出信号唤醒等待的进程. sem_getvalue:得到信号量的值 得到信号量的值. sem_getvalue:得到信号量的值. sem_destroy:删除信号量 删除信号量. sem_destroy:删除信号量. 信号量实例见: 信号量实例见:sem_mutex.c sem_syn.c

www.chinaEDA.cn

相关文章:
Linux 的多线程编程的高效开发经验
搜 试试 帮助 全部 DOC PPT TXT PDF XLS 百度文库 专业资料 IT/计算机...嵌入式Linux应用程序开发详... 27页 5财富值 linux多线程编程(中嵌教育... ...
嵌入式系列 linux多线程编程笔记 - 收集整理
linux 多线程编程笔记 转载 2009-11-08 21:16 阅读 0 评论 0 私人日志 字号: 大中小 进程是系统中程序执行和资源分配的基本单位.每个进程都拥有自己的数据段,...
嵌入式Linux实验报告
嵌 入 式程序设实验报告成 计 评语: 绩 教师:年...2) 在虚拟机中的 CentOS(宿主机)搭建开发环境。 ...3) 掌握嵌入式 Linux 多进程、多线程、I/O 多路...
一步一步教你开发嵌入式Linux应用程序
一步一步教你开发嵌入式 Linux 应用程序 本文中采用西安建华科技实业有限公司研发的 SldView 嵌入式 Linux 集成开发工具开发 ucLinux、Linux 的应用程序。SldView ...
嵌入式Linux系统开发教程实验报告
搜 试试 7 帮助 全部 DOC PPT TXT PDF XLS ...学习在 Linux 下的编程和编译过程, 以及ARM 开发板...前面第一章第四 节中关于嵌入式Linux 环境开发环境...
学习嵌入式Linux开发有哪些好的书籍?
_育儿理论经验_幼儿教育_教育专区。很多的嵌入式 Linux 新手,对自己的学习过程...《Linux 内核编程》 4、 《Linux 设备驱动开发》 (LDD) 硬件基础 1、 《ARM...
《嵌入式linux开发基础》复习题
搜试试 2 帮助 全部 DOC PPT TXT PDF XLS ...13、嵌入式 Linux 开发中使用 GDB 调试,说法错误的...62、 在 Linux 多线程编程时,需要包含头文件___...
嵌入式Linux系统开发教程(第二版)参考答案(贺丹丹)
嵌入式Linux系统开发教程(第二版)参考答案(贺丹丹)_工学_高等教育_教育专区。参考...在上一步的编译过程中, 已经生成了 arm-linux-gcc 这个工具,利用这个工具去...
嵌入式Linux应用程序开发期末考试题库及答案
嵌入式Linux应用程序开发期末考试题库及答案_IT认证_资格考试/认证_教育专区。湖南...make oldconfig 在 Linux 内核配置过程中,下面哪项命令建立依赖关系 A、make ...
linux嵌入式学习路线(新版)
搜 试试 7 帮助 全部 DOC PPT TXT PDF XLS ...ARM+LINUX学习路线 14页 免费 嵌入式linux驱动开发工程...l​i​n​u​x​​入​式​学...
更多相关标签:
嵌入式系统课件 | 嵌入式课件 | 嵌入式c程序设计课件 | 国嵌嵌入式课件 | 嵌入式linux | linux嵌入式开发 | 嵌入式linux怎么学 | 嵌入式linux操作系统 |