秋招C++开发学习之路day14

day17(线程产生、线程锁、线程同步、死锁条件和解决死锁、互斥锁)

  1. 线程产生的原因,进程可以使多个程序并发的执行,提高系统的资源利用率和吞吐量,但是有些缺点:
    进程同一个时间只能干一件事,执行过程中如果有阻塞,整个进程就会挂起。
    线程作为并发执行的基本单位,减少程序在并发执行时的时空开销,提高了并发性。启动一个新的进程,必须分配新的独立的地址空间,建立很多的数据表。切换效率上线程也要快的多,因为线程共享地址空间,还能使多CPU系统更加有效, 改善程序结构,长而复杂的程序可以分成多个线程,便于理解和修改。
  2. 单核机器上写多线程程序,也需要加锁。
    线程锁通常用来实现线程的同步和通信,在抢占式操作系统中,通常为每个线程分配一个时间片,某个线程的时间片耗尽则系统会将其挂起,然后运行另一个线程。若这两个线程共享数据的话,没有线程锁就会造成共享数据修改引发冲突。
  3. 线程间的同步方式
    信号量。
    互斥量(互斥锁),主要用于线程互斥,不能保证按序访问,可以和条件锁一起实现同步。
    进入临界区时,需要获得互斥锁并加锁,离开临界区时需要解锁,以唤醒等待该互斥锁的线程。
    条件变量,又称条件锁,用于在线程之间同步共享数据的值。条件变量提供一种线程间通信的机制,当某个共享数据达到某个值时,唤醒等待这个共存数据的一个或多个线程。
  4. 进程是资源分配的最小单位,线程是CPU调度的最小单位。
  5. 死锁发生条件和解决死锁的办法。
    死锁是指两个或两个以上的进程因为争夺资源造成相互等待的情况。死锁发生的四个必要条件:
    互斥条件,进程对分配到的资源不允许其他进程访问,若其他进程想要访问则只能等待,直到占用该资源的进程被释放。
    请求和保持条件,进程获得一定的资源后,又对其他资源发出请求,但是该资源可能被其他进程占用,此时请求阻塞,但该进程不会释放已经占有的资源。
    不可剥夺条件,进程已获得资源,在未完成使用之前,不能被剥夺,只能使用完后自己释放。
    环路等待条件,进程发生死锁以后,必然存在一个进程-资源之间的环形链。

解决死锁的方法:即破坏上述的四个条件之一。主要方法:
资源一次性分配,从而剥夺请求和保持。
可剥夺资源,当新进程的资源未得到满足时,释放已占有的资源,从而破坏不可剥夺的条件。
资源有序分配法,系统给每类资源分配一个序号,每个进程按照编号递增请求资源,释放则相反,从而破坏环路等待条件。
6. 互斥锁mutex,用于保证在任何时刻,都只能有一个线程访问该对象。当获取锁操作失败时,线程会进入睡眠,等待锁释放时被唤醒。
读写锁rwlock,分为读锁和写锁。处于读操作时,可以允许多个线程同时获取读操作。但是同一时刻只允许一个线程有写操作。写锁会阻塞其他读写锁。唤醒时优先考虑写者。适用于读取数据的频率远远大于写数据的场合。
互斥锁和读写锁的区别:
读写锁分读者和写者,互斥锁不区分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值