互斥量和死锁
2018-02-26 22:41
92 查看
1、互斥量可以理解为一把锁,在访问共享资源的时候,通过加锁,来确保在同一时间只有一个线程可以访问该共享资源。这里主要总结一下Linux下锁的使用,并通过锁的使用来进一步加深对互斥量的理解。 2、通过具体实例来说明用法:
如果对一个互斥量加锁两次,就会出现死锁,在上面的代码中重复一句加锁操作:
#include<stdio.h> #include<pthread.h> #include<unistd.h> pthread_mutex_t testlock; pthread_t test_thread; void *test(void*) { pthread_mutex_lock(&testlock); printf("thread Test\n"); pthread_mutex_unlock(&testlock); } int main() { pthread_mutex_init(&testlock, NULL); pthread_mutex_lock(&testlock); printf("main proc..\n"); int ret = pthread_create(&test_thread, NULL, test, NULL); if(ret == -1) printf("createthread error!"); sleep(2); pthread_mutex_unlock(&testlock); sleep(2); return 0; }
从这段代码可以看到,test线程必须等到主进程释放锁之后才能向下执行。
3、死锁如果对一个互斥量加锁两次,就会出现死锁,在上面的代码中重复一句加锁操作:
#include<stdio.h> #include<pthread.h> #include<unistd.h> pthread_mutex_t testlock; pthread_t test_thread; void *test(void*) { pthread_mutex_lock(&testlock); printf("thread Test\n"); pthread_mutex_unlock(&testlock); } int main() { pthread_mutex_init(&testlock, NULL); pthread_mutex_lock(&testlock);
pthread_mutex_lock(&testlock); printf("main proc..\n"); int ret = pthread_create(&test_thread, NULL, test, NULL); if(ret == -1) printf("createthread error!"); sleep(2); pthread_mutex_unlock(&testlock); sleep(2); return 0; }
运行后就会发现死锁。接着考虑两个线程之间的死锁:
#include<stdio.h> #include<pthread.h> #include<unistd.h> pthread_mutex_t testlock1,testlock2; pthread_t test_thread1,test_thread2; void *test1(void*) { pthread_mutex_lock(&testlock1); printf("thread Test1..\n"); sleep(1); pthread_mutex_lock(&testlock2); printf("get Testlock2\n"); pthread_mutex_unlock(&testlock2); pthread_mutex_unlock(&testlock1); } void *test2(void*) { pthread_mutex_lock(&testlock2); printf("thread Test2..\n"); sleep(1); pthread_mutex_lock(&testlock1); printf("get testlock1\n"); pthread_mutex_unlock(&testlock1); pthread_mutex_unlock(&testlock2); } int main() { pthread_mutex_init(&testlock1, NULL); pthread_mutex_init(&testlock2, NULL); printf("main proc..\n"); int ret1 = pthread_create(&test_thread1, NULL, test1, NULL); int ret2 = pthread_create(&test_thread2, NULL, test2, NULL); if(ret1==-1 || ret2==-1) printf("createthread error!"); sleep(5); return 0; }这里,线程test1和线程test2都在等对方释放锁,于是就陷入死锁状态。
相关文章推荐
- uc笔记12---竞争与同步,互斥量,信号量,死锁,条件变量,哲学家就餐问题
- 线程同步之——互斥量及死锁问题
- C++_800_0605_互斥量死锁问题详解
- 6.5、互斥量概念、用法、死锁演示及解决详解
- 【Linux】深入理解线程(线程同步、互斥量mutex、死锁、读写锁、条件变量、信号量)
- 互斥量避免死锁
- UNIX环境高级编程——线程同步之互斥量 && 死锁
- 1线程同步:互斥量,死锁
- 操作系统 自旋锁+信号量+互斥量+临界区+死锁的区别
- 多线程互斥量以及死锁问题解决详解
- 哲学家就餐问题--信号量和互斥量预防死锁
- 【Linux】深入理解线程(线程同步、互斥量mutex、死锁、读写锁、条件变量、信号量)
- SqlServer表死锁的解决方法
- 如何快速发现和处理sqlserver数据库的死锁
- 嵌入式操作系统内核原理和开发(互斥量)
- 关于死锁的一些记录
- java 死锁及解决
- Java实现死锁
- 笔试题 遗忘点记录 面向对象特点 + 产生死锁条件+ windows内存管理方法
- 死锁的形成