多线程编程细节补充

学习笔记记录

所谓的线程同步不是说线程并行,而是让线程线性执行。
当进程创建子线程后,main函数退化为主线程,子线程会瓜分原进程的栈区,共享堆区、代码等。
当子线程结束后,其瓜分的栈区会被自动回收,所以切记不能返回子线程的临时变量地址。

pthread_exit函数用于main函数,可以防止主线程执行结束会直接终止子线程,main函数在调用exit退出后也会让子线程执行完再回收资源。
子线程使用时可以立刻退出线程并可以在参数中返回数据回主线程,即join调用的地方。

主线程调用pthread_join函数,用于回收子线程的内核资源

线程分离函数pthread_detach函数,顾名思义是将子线程与主线程分离。没分离之前,主线程与子线程是有联系的,主线程需要回收子线程资源,即主线程要调用join函数阻塞等待子线程结束然后回收其资源,但这样会让主线程一直阻塞在原地干不了其他事情,所以可以分离线程:分离后,子线程的回收不由主线程负责。一般需要与exit函数一起用,防止主线程没有阻塞直接结束了而子线程也一起结束。

pthread_lock函数要避免嵌套,防止死锁。
互斥锁lock是用于保证线程之间的线性执行,按顺序执行。
条件变量cond是用于让多个线程阻塞,等待。
互斥量中记录着这把锁是上锁还是解锁状态,如果是上锁是哪个线程上的锁。一般情况下,每一个共享资源对应一个互斥锁,与线程数无关。互斥锁的上锁与解锁之间夹着对特定共享资源修改的代码块。
对于互斥锁,lock函数不应该放在会阻塞的函数前面(能自动解锁的函数除外比如condwait),这样很可能会造成死锁。如果线程抢到锁了但是满足不了阻塞函数的条件就还是会阻塞在原地但却无法解锁。
wait函数阻塞后,如果遭到其他线程唤醒停止阻塞,那么会开始与其他也被唤醒的线程抢锁,如果抢到了锁,就继续从wait函数阻塞的地方开始执行,然后判断while循环条件,while跳出…;如果没有抢到锁就会继续阻塞。
也就是wait函数的动作有:解锁和阻塞在原地、唤醒后的抢锁、抢锁成功后停止阻塞继续执行。所谓的条件判断是由wait函数外面的while循环来实现的。

条件变量中记录着阻塞线程的信息,生产者消费者模型中生产者和消费者应该使用不同的条件变量。即wait函数和signal和broadcast函数的条件变量不同。

对于信号量,关键是初始化的资源数。当初始化资源数为1时,即使有多个线程也不必担心线程不同步问题,信号量函数会自动解决这个问题;当初始化资源数为大于1时,对资源的操作就需要添加互斥锁了,保证线程的同步。另外需要说明的是,信号量的资源数是对一类线程来说的,例如生产者消费者模型,生产者的资源可以是车位,消费者的资源可以是车辆,那么就需要两个信号量。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值