线程复习笔记

1 篇文章 0 订阅

一、线程和进程的区别

线程是竞争系统资源的最小单位。进程是线程的容器,一个进程可以包含多条线程,同一个进程的所有线程共用这个进程的内存空间。创建一个新进程则会拷贝一个新的内存空间。与进程相比,线程是一种更加节俭的的多任务处理方式,但是程序的健壮性线程就没有进程强。

二、API介绍

1.创建一个线程 pthread_create(pthread_t thread, const pthread_attr_tattr,void *(*start_routine) (void *), void *arg);

pthread_t *thread:第一个参数是一个指针,指针指向一块可用的内存空间,用来保存新创建的线程的线程ID。
pthread_attr_t *attr:线程属性:pthread_attr_t ,结构体中保存了线程的一些属性。如线程的id,线程的优先级,线程的栈空间大小 。在pthread中,线程属性使用pthread_attr_t来描述,同时还提供了几个用于改变线程属性的API函数,但是不建议程序员直接修改pthread_attr_t的结构体,而是指定为NULL,表示使用线程默认属性。
void *(*start_routine) (void *):线程函数。线程函数的实际参数。如果线程函数不需要参数,可以写NULL。如果线程函数有一个参数,可以传入一个指针。如果线程函数有多个参数,可以封装成一个结构体
返回值:
成功返回0
失败返回-1,同时errno被设置
新线程执行的顺序是由系统调度决定的
2.线程退出:void pthread_exit(void *retval); ,
retval:退出码,可以被其他的线程读取到
retval指向的值不应该位于调用者线程的栈上(局部内存空间),因为在线程终止后该线程栈中的内容是未定义的。不关心退出码可以写为NULL。
3.线程回收: int pthread_join(pthread_t thread, void **retval);
thread:要等待退出的那一个线程的线程ID
retval:二级指针,用来保存退出线程的返回状态。把线程的返回值(退出值)保存到retval指向的内存中去。只不过retval是一个二级指针,保存了一个一级指针的地址,因为线程的返回值本来就是一个一级指针。
返回值:成功返回0,失败返回对应的错误码。
作用:1.等待线程退出2.回收被等待的线程的资源。
4.线程分离:int pthread_detach(pthread_t thread);
thread:你要分离的线程的线程号。
一个线程退出了,并不代表它所占用的资源都被释放掉了。一个线程退出.它的资源是否全部被释放,取决于它的一个属性
detach 分离属性
ENABLE 处于分离状态
该线程结束后,它所有的资源就会被自动的释放
DISABLE 处于非分离状态(默认)
该线程结束,它有部分的资源不会自动释放,必须要其他的线程调用pthread_join这个函数才能释放所有资源。

三、线程之间的同步/互斥

线程之间的需要访问一些共享资源,为了保证对共享资源的有序访问,防止竞争,需要对共享资源进行某种方式的保护,使得共享资源有序访问。
步骤:
1.先确定共享资源
2.确定临界区
3.在使用保护机制去保护
线程中有哪些常见的共享资源吗?
任何的全局变量,任何的malloc的内存…都可以是共享资源,所有的线程都可以访问.

.线程互斥锁
线程互斥锁是存在于进程地址空间内部的一种保护机制,“类似于信号量”,只不过存在于进程内部的地址空间(默认)
在POSIX多线程中,使用类型pthread_mutex_t来描述一个线程互斥锁
操作方法非常类似于“无名信号量”
步骤:
1.定义一个线程互斥锁
2.初始化线程互斥锁
3.P/V操作
4.销毁线程互斥锁

初始化一个指定的线程互斥锁:int pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr);
mutex:要初始化的线程互斥锁的地址
attr:线程互斥锁的属性,一般建议写NULL,表示使用默认属性
返回值:
成功返回0
失败返回非0,errno被设置
例:pthread_mutex_t mutex;//定义一个锁

pthread_mutex_init(&mutex,NULL);
销毁一个指定的线程互斥锁。
int pthread_mutex_destroy(pthread_mutex_t *mutex);
mutex:你要销毁的线程互斥锁
销毁并不是删除,只是把锁的值变成未定义的!!
pthread_mutex_lock P操作
int pthread_mutex_lock(pthread_mutex_t *mutex);
pthread_mutex_unlock V操作
pthread_mutex_trylock:是尝试获取mutex指向的线程互斥锁,“非阻塞版本”

生产者-消费者模型
生产者负责 产生 数据(任务)
消费者负责 消耗 数据(任务)
存在的问题:
1.存储数据/任务的缓冲区是一个共享资源
“互斥问题”
信号量/线程互斥锁
2.当缓冲区没有数据的时候,消费者线程怎么办? 同步问题
a.不停的测试,看是否有任务来了 ----->轮询
浪费CPU
b.使用类似于“信号”的模式
当缓冲区没有数据的时候,让出CPU(线程/进程休眠),当有数据产生的时候
在唤醒(生产者)我,再通知(生产者)我
-------->线程的条件变量

总结

在程序设计中,到底是要多线程还是多进程呢?
在需要进行数据共享比较多的时候,线程占优势
可靠性和耦合性性来说,多进程占优势
创建速度来说,进程创建/销毁/切换速度慢,线程创建/销毁/切换速度快,
从占用的资源来说,进程占用的内存多,CPU利用率比较低,线程占用的内存少,切换方便,

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值