首页 > 代码库 > Linux线程
Linux线程
线程
线程是CPU调度的基本单位
强调共享,必须有自己的硬件上下文
线程是进程的一个独立执行流,必须有运行时栈
由于同一进程的多个线程共享同一地址空间,因此各线程共享以下进程资源和环境
①Text Segment
②Data Segment
③文件描述符表
④每种信号的处理方式(SIG_IGN、SIG_DFL或者自定义的信号处理函数)
⑤当前工作目录
⑥进程组ID和组ID
线程大部分有些资源是共享的,但是也有部分是私有的
①线程ID(只在线程内部有效)
②硬件上下文(用来调度与切换、保存与恢复)
③栈空间(私有栈结构)
④errno变量
⑤信号屏蔽字
⑥调度优先级
Linux中没有线程,都是用进程模拟实现的,所以Linux下线程也叫轻量级进程(LWP)
线程产生的原理:父进程fork产生多个子进程,由于没有调用exec函数,子进程共享父进程的地 址空间,多个执行流同时执行代码段中不同的代码。因此可以认为线程是在进程内部运行的。
在Linux下CPU是看不到线程的,只能看到PCB
Linux下的进程可以看做只有一个执行流的线程
学习线程分为线程控制(创建、等待、分离、终止)和线程的同步与互斥两部分
终止线程有3种方式
①在线程内部return (退出码由用户自定义)
②pthread_exit() (退出码由用户自定义)
③pthread_cancel() (可以自己把自己取消,被别的线程取消)
线程的分离:
①线程属性默认是可结合的,如果没有被分离,则它必须被等待
②可主线程分离新线程,也可以新线程主动分离
③线程分离后不需要等待
互斥锁
①初始化有2种方式:宏和函数
②加锁有3种:lock、trylock(非阻塞,直接返回)、unlock
③destroy:pthread_mutex_destroy()
死锁分为自死锁和ABBA死锁,产生死锁的条件有4个
①互斥使用
②不可抢占
③请求与保持
④循环等待
避免死锁的方法有3种
①破坏“不可剥夺”条件
②破坏“请求和保持”条件
③破坏“循环等待”条件
在Linux中线程函数位于libpthread共享库中,因此编译时要加上-lpthread选项
同步:在互斥的基础上,多个执行流有一定的顺序性,从而让多进程、多线程协同工作
同步在Linux下用条件变量实现
本文出自 “zgw285763054” 博客,请务必保留此出处http://zgw285763054.blog.51cto.com/11591804/1853223
Linux线程