3.线程的同步什么是互斥量(锁)?这样比喻:单位上有一台打印机(共享数据a),你要用打印机(线程1要操作数据a),同事老王也要用打印机(线程2也要操作数据a),但是打印机同一时间只能给一个人用,此时,规定不管是谁,在用打印机之前都要向领导申请许可证(lock),用完后再向领导归还许可证(unlock),许可证总共只有一个,没有许可证的人就等着在用打印机的同事用完后才能申请许可证(阻塞,线程1lock互斥量后其他线程就无法lock,只能等线程1unlock后,其他线程才能lock)。那么,打印机就是共享数据,访问打印机的这段代码就是临界区,这个必须互斥使用的许可证就是互斥量(锁)。互斥量是为了解决数据共享过程中可能存在的访问冲突的问题。这里的互斥量保证了使用打印机这一过程不被打断。死锁多线程编程时要考虑多个线程同时访问共享资源所造成的问题,因此可以通过加锁解锁来保证同一时刻只有一个线程能访问共享资源;使用锁的时候要注意,不能出现死锁的状况;死锁就是多个线程争夺共享资源导致每个线程都不能取得自己所需的全部资源,从而程序无法向下执行。产生死锁的四个必要条件(面试考点):1.互斥(资源同一时刻只能被一个进程使用)2.请求并保持(进程在请资源时,不释放自己已经占有的资源)3.不剥夺(进程已经获得的资源,在进程使用完前,不能强制剥夺)4.循环等待(进程间形成环状的资源循环等待关系)死锁预防:破坏死锁产生的四个条件(完全杜绝死锁)死锁避免:对分配资源做安全性检查,确保不会产生循环等待(银行家算法)死锁检测:允许死锁的发生,但提供检测方法死锁解除:已经产生了死锁,强制剥夺资源或者撤销进程临界区、信号量、互斥量(锁)的区别与联系:三者都可用来进行进程的同步与互斥;临界区速度最快,但只能作用于同一进程下不同线程,不能作用于不同进程;临界区可确保某一代码段同一时刻只被一个线程执行;EnterCriticalSection ():LeaveCriticalSection ()进入临界区离开临界区信号量多个线程同一时刻访问共享资源,进行线程的计数,确保同时访问资源的线程数目不超过上限,当访问数超过上限后,不发出信号量;P操作 申请资源V操作 释放资源互斥量(锁)比临界区满,但支持不同进程间的同步与互斥;同步与互斥任务运行时,有些任务片段间存在严格的先后顺序,同步指维护任务片段的先后顺序;直观的表现就是若A片段执行完才能执行B片段,线程1执行A片段,线程2执行B片段,在B片段执行前申请锁I,在A片段执行结束后解锁I;未申请到锁(即A片段还未执行完,线程1等待线程2执行。A片段解锁了B片段才能申请到锁,保证了A片段执行结束了B片段才能运行,称之为同步;互斥就是保证资源同一时刻只能被一个进程使用;互斥是为了保证数据的一致性,如果A线程在执行计算式A的时候,某个量被B线程改掉了,这可能会出现问题,于是要求资源互斥,我在用它你就不能用,等我用完了你再用,我们彼此互不干扰。互斥锁互斥量mutex就是互斥锁,加锁的资源支持互斥访问;读写锁*shared_mutex读写锁把对共享资源的访问者划分成读者和写者,多个读线程能同时读取共享资源,但只有一个写线程能同时读取共享资源shared_mutex通过lock_shared,unlock_shared进行读者的锁定与解锁;通过lock,unlock进行写者的锁定与解锁。复制代码shared_mutex s_m;std:string book;void read(){s_m.lock_shared();cout
THE END
- 本文链接:
- https://zxki.cn/wzym/55772.html
- 版权声明:本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络收集整理,如果您喜欢该程序和内容,请支持正版,购买注册,得到更好的正版服务。我们非常重视版权问题,如有侵权请邮件与我们联系处理。敬请谅解!
请登录后发表评论
注册
停留在世界边缘,与之惜别