linux 多线程学习

LESSON1

目标:掌握线程下基本改进
了解线程的优势

进程:一个正在执行的程序 ,它是资源分配的最小单位
进程中的事情需要按照一定的顺序逐个进行
线程:有时又称轻量级进程,程序执行的最小单位,系统独立调度和分派CPU的基本单位,它是进程的一个实体。一个进程中可以有多个线程,这些线程共享进程的所有资源,线程本身只包含了一点必不可少的资源。进程只是为了申请资源,真正执行的是线程,例如一个程序中 的主函数main就是一个线程

进程出现了很多弊端,一是由于进程是资源拥有者,创建 撤销与切换存在较大的时空开销y,因此要引进轻量型进程;二是由于多处理机(SMP)出现,可以满足多个运行单位而多个进程并行开销过大

重点难点
并发 并行,同步 异步

并发:并发是指在同一时刻,只能有一条指令执行,但多个进程指令b被快速轮换执行,使得在宏观上具有多个进程同时执行的效果
看起来同时发生,单核。
并行:并行是指在同一时刻,有多条指令在多个处理器上同时执行
真正的同时发生
同步:彼此有依赖关系的调用不应该同时发生,而同步就是要阻止那些同时发生的事情。
异步:异步的概念和同步相对,任何两个彼此独立的操作是异步的,它表明事情独立发生

多线程的优势
1、在多处理器中开发程序的并行性
2、在等待慢速IO操作时,程序可以执行其他操作,提高并发性
3、模块化的编程,能更清晰的表达程序中独立事件的关系,结构清晰
4 占用较少的系统资源
多线程不一定要多处理器
考核目标:并发并行的区别

LESSON2

**课程目标**:
学会创建一个线程
掌握pthread_create()的参数意义

线程ID获取用pthread_self()
掌握线程的生命周期
重点难点:
pthread_create的参数:
int pthread_create(pthread_t *tidp,const pthread_attr_t attr,(void)(start_rtn)(void),void *arg);
第一个参数为指向线程标识符的指针。
第二个参数用来设置线程属性。
第三个参数是线程运行函数的起始地址。
最后一个参数是运行函数的参数。
返回值 表示成功,返回0;表示出错,返回-1。

线程的生命周期

进程或主线程结束,所有线程都会结束。可以用pthread_exit退出主进程来等待其他进程完成

回收
线程的分离属性:
分离一个正在运行的线程并不影响它,仅仅是通知当前系统该线程结束时,其所属的资源可以回收。一个没有被分离的线程在终止时会保留它的虚拟内存,包括他们的堆栈和其他系统资源,优势这种线程被称为“僵尸线程”.创建线程时默认是非分离的。
如果线程具有分离属性,线程终止时会被立刻回收,回收将释放掉所有在线程终止时未释放的系统资源和进程资源,包括保存线程返回值的内存空间、堆栈、保存寄存器的内存空间等。
终止被分离的线程会释放所有的系统资源,但是你必须释放由该线程占有的程序资源。例如由malloc火鹤mmap分配的 内存可以在任何时候由任何线程释放,条件变量,互斥量、信号灯可以由任何线程销毁,只要他们被解锁了或者没有线程等待。但是只有互斥量的主人才能解锁它,所以在线程中之前,你需要解锁互斥量。

主线程是在默认堆栈上运行,这个栈k可以增长到足够的长度。而普通线程的堆栈是受限制的,一旦溢出就会产生错误
考核目标   :
如何给新线程传递多个参数——有结构体指针
线程有几种基本状态

作业:编写应用程序,创建一个线程,向该线程传递一个结构体并打印该收到的数据
:两个线程交替打印一个打印奇数一个打印偶数

LESSON3:

课程目标:

1.掌握线程的终止方式

exit是危险的
如果进程中的任意一个线程调用了exit,那么整个进程都会退出
普通的单个线程有以下三种方式退出,这样不会终止进程
(1)从启动例程中返回也就是return,返回值是线程的退出码
(2)线程可以被同一进程中 的其他线程取消
(3)线程调用pthread_exit(voidraval)函数,raval是退出码 是函数的返回值 直接用(void)加一个数就可
2.掌握线程的链接、退出操作
int pthread_join(pthread_t tid,void**rval)
调用该函数的线程会一直阻塞,直到指定的线程tid调用pthread_exit、returen或者被取消
参数tid就是指定线程的id
参数rval是指定线程的返回码。可以在前面先定义好此指针。如果线程被取消,那么rval被置为PTHREAD_CANCELED 其实就是-1
函数调用成功返回0 失败返回错误码
调用pthread_join会使指定的线程处于分离状态,如果指定线程已经处于分离状态,那么调用就会失败。
pthread_detach可以分离一个线程,线程可以自己分离自己
int pthread_detach(pthread_t pid)
成功返回0失败返回错误码

当pthread_join返回以后,其他的线程就不能调用pthread_join链接pid指定的线程了。一个线程被成功的链接了其他线程就无法连接了。join属性的线程,需要同一个进程中的其他线程,获取线程终止的状态,并释放资源.
detach属性的线程,在线程结束后,由系统释放资源.
3.线程的取消
取消函数
int pthread_cancel(pthread_t tid)
取消tid指定的线程,成功返回0.取消只是发送一个请求,并不意味着等待线程结束,发生成功也不意味着tid一点会终止
用于取消一个线程,它通常需要被取消线程的配合。线程在很多时候会查看自己是否有取消请求,如果有就主动退出,这些查看是否有取消的地方称为取消点。
很多地方都包含取消点,包括
篇thread_join()、pthread_testcancel,pthread_cond_waid()、sem_wai()、sigwait()

取消状态
就说线程对取消信号的处理方式,忽略或者响应。线程创建时默认相应取消信号
int pthread_setcancelstate(int state,int*oldstate)(只对本线程生效)
设置本线程对cancel信号的反应,
参数1:PTHREAD_CANCEL_ENABLE响应取消信号和PTHREAD_CANCEL_DISABLE忽略取消信号
canshu2:一般为NULL,不为NULL时则存入旧的的取消状态以便恢复

取消类型
是线程对取消信号的相应方式,立即取消或延时取消。线程创建时默认延时取消

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值