进程线程——线程

1.什么是线程

        线程:轻量级的进程

2.什么时候用多进程,什么时候用多线程

        创建和销毁较频繁使用线程,因为进程花销大

        大量数据传输使用线程,因为多线程切换速度快,不需要跨越进程边界

        安全稳定选进程,快速频繁选线程

 3.线程的相关函数

3.1  创建线程

3.2 阻塞等待子线程结束回收子线程资源

2.回收子线程资源

1.pthread_join()主线程回收资源

2.pthread_detach()使子线程属于分离状态,不阻塞,子线程退出自己回收自己的资源

3.pthread_join()和pthread_detach()区别

1)pthread_join():

创建线程默认的属性就是joinable的,此时需要pthread_create与pthread_join配合使用;

线程创建者通过pthread_join获取线程函数返回值,释放资源等。(jion可以理解为孩子与父母没有分家,有些事还需要父母帮忙完成。)

2)pthread_detach():

使用该函数可以将子线程与主线程分离,子线程结束后,自己回收自己的资源,而不需要主线程回收资源(detach可以理解为孩子与父母分家,事情都需要自己完成)

3.线程的退出

1.主动退出  pthread_exit()

可以和pthread_join()配合使用,子线程给主线程传值

2.被动退出  pthread_cancel()

4.线程间数据的传递,除了栈区之外,其他数据(全局变量/堆区)是共享的

1.验证全局变量和堆区是共享的

2.主线程给子线程传值

3.子线程给主线程传递

5.线程的互斥和同步

互斥:

1.什么是互斥

多线程同时访问临界资源,当某线程正在执行,不允许其他线程访问资源

   2.买票问题

     客户端: 1.火车站售票窗口  10以上

            2.移动端:12306网址

            3.12306APP

     西安--->郑州 10月20   G567 16车8F

     张三  西安--->郑州 10月20   G567 16车8F

     除了张三之外看不见

2.如何实现线程互斥

  • 引入互斥(mutual exclusion)锁的目的是用来保证共享数据操作的完整性。
  • 互斥锁主要用来保护临界资源
  • 每个临界资源都由一个互斥锁来保护,任何时刻最多只能有一个线程能访问该资源
    • 线程必须先获得互斥锁才能访问临界资源,访问完资源后释放该锁。如果无法获得锁,线程会阻塞直到获得锁为止

互斥锁

创建锁:

      pthread_mutex_t 全局的锁

初始化

      pthread_mutex_init()

     

上锁

      pthread_mutex_lock()

         

释放锁

      pthread_mutex_unlock()

             

同步:

1.什么同步

 多线程同时访问临界资源,线程按照某种顺序执行

2.如何实现同步

无名信号量:  ---->只能线程中使用

有名信号量  ---->进程中使用

信号灯集     ----->进程间通信

信号量本质上是一个非负的整数计算器,它用来控制对公共资源的访问。

当信号量用于互斥操作时,往往只设置一个信号量。

当信号量用于同步操作时,往往会设置多个信号量,并安排不同的初始值来实现它们之间的顺序执行。

 Linux实现POSIX的无名信号量,

 sem_init() 初始化信号量.

 sem_wait()   -----P操作  -1

             在信号量大于零时, P操作   信号量-1

             若信号量的值为零时,阻塞线程

 sem_post()   -----V操作 +1

             给信号量的值加1,同时唤醒等待的线程

 

sem_getvalue() 获得信号量的值

 

sem_destroy()用于删除信号量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值