本文主要是介绍Linux系统编程_课时82_互斥锁死锁,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
课时82_互斥锁死锁
文章目录
- 课时82_互斥锁死锁
- 1、造成死锁的原因
- 1.1、自己锁自己
- 1.2、线程间互锁
1、造成死锁的原因
1.1、自己锁自己
在锁还没有解锁时,再次加锁。
//子线程pthid_p1,操作全局变量number
void* pthid_p1_func(void* arg)
{for(int i=0;i<COUNT_MAX;++i){pthread_mutex_lock(&mutex); //访问共享资源(全局变量number)前加锁number++;pthread_mutex_lock(&mutex); //锁没解锁,在访问number前再次加锁,则线程永久阻塞在此处,死锁!number++;//访问共享资源(全局变量number)后解锁pthread_mutex_unlock(&mutex); //usleep主动放弃cpu,模拟cpu被抢占usleep(100); }return NULL;
}
1.2、线程间互锁
线程1对共享资源A加锁成功—A锁
线程2对共享资源B加锁成功—B锁
现在,线程1要访问共享资源B,线程2要访问共享资源A。
那么:
线程1阻塞在B锁上
线程2阻塞在A锁上
解决方法:
(1)让所有线程都按照一定顺序访问共享资源,例如线程1和2都先访问共享资源A,再访问共享资源B。
(2)在访问其他锁的时候,需要先将自己的锁解开
(3)使用trylock()函数,避免线程阻塞。
这篇关于Linux系统编程_课时82_互斥锁死锁的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!