流量套餐汇总网站,南通优化网站价格,佛山做外贸网站如何,怎么做虚拟的网站死锁 #x1f96d;什么是死锁#x1f965;死锁产生的条件#x1f95d;如何避免死锁#x1f345; 避免死锁算法 #x1f96d;什么是死锁 死锁是多线程或多进程编程中的一种常见问题#xff0c;指的是两个或多个线程#xff08;或进程#xff09;相互等待对方持有的资源什么是死锁死锁产生的条件如何避免死锁 避免死锁算法 什么是死锁 死锁是多线程或多进程编程中的一种常见问题指的是两个或多个线程或进程相互等待对方持有的资源导致程序无法继续执行下去进而陷入无限等待的状态。 死锁产生的条件
互斥条件一个资源每次只能被一个执行流使用请求与保持条件一个执行流因请求资源而阻塞时对已获得的资源保持不放不剥夺条件:一个执行流已获得的资源在末使用完之前不能强行剥夺 也就是说不会因为线程权限的优先级问题拿到别的线程的锁循环等待条件:若干执行流之间形成一种头尾相接的循环等待资源的关系
结合代码说明一下
代码1
#include unistd.h
#include stdlib.h
#include stdio.h
#include string.h
#include pthread.h
#includeiostream
#include sys/syscall.h
using namespace std;
pthread_mutex_t mutex PTHREAD_MUTEX_INITIALIZER; int cnt50;
void *Func(void * args)
{string name static_castchar *(args);while (true){pthread_mutex_lock(mutex); //加锁 coutnamecount:cnt--endl;pthread_mutex_unlock(mutex);sleep(1);}}int main()
{pthread_t td1;pthread_t td2;pthread_t td3;pthread_t td4;pthread_create(td1,nullptr,Func,(void*)td1);pthread_create(td2,nullptr,Func,(void*)td2);pthread_create(td3,nullptr,Func,(void*)td3);pthread_create(td4,nullptr,Func,(void*)td4);pthread_join(td1,nullptr);pthread_join(td2,nullptr);pthread_join(td3,nullptr);pthread_join(td4,nullptr);return 0;
}运行 正常运行没发现异常 多线程执行–操作
举例这时候如果不小心把unlock写成lock 这里直造成死锁原因是一个线程去访问临界资源的时候申请了一把锁然后往下执行代码又去申请了一把锁而这时候去申请锁的时候发现没有了就进入了挂起等待的状态等待其他线程把锁还回来但是此时锁正在它自己手上就永远等不到第二次申请的这把锁这就造成了死锁…
如何避免死锁
破坏死锁的四个必要条件加锁顺序一致避免锁未释放的场景资源一次性分配 避免死锁算法
银行家算法 点击跳转: 银行家算法
相关博客
链接: 死锁面试