《Linux系统线程死锁实验报告.docx》由会员分享,可在线阅读,更多相关《Linux系统线程死锁实验报告.docx(4页珍藏版)》请在三一办公上搜索。
1、Linux系统线程死锁实验报告 实验四 Linux系统线程死锁实验报告 关键问题:实例可能会发生死锁,要求修改实例,预防死锁发生 设计思路:采用破坏占有且等待条件预防死锁发生!其中采用“空手申请资源策略预防死锁,即每个进程仅在它不占有资源时才可以申请资源。一个进程可能需要申请并使用某些资源,在它申请另外附加资源前必须先释放当前分到的全部资源! 实现的关键代码: #include #include #include #include #define Max 7 pthread_t EMax;/从东方来的汽车。每辆汽车对应一个线程。 pthread_t WMax;/从西方来的汽车 pthread_
2、t SMax;/从南方来的汽车 pthread_mutex_t s1;/线程互斥信号量,对应C路段 pthread_mutex_t s2; /线程互斥信号量,对应B路段 pthread_mutex_t s3; /线程互斥信号量,对应A路段 pthread_mutex_t s4; /线程互斥信号量,对应D路段 int i; void *s(void *a1) /南边来的汽车的线程执行体 int serialNum=*(int*)a1);/取当前汽车序号 pthread_mutex_lock(&s1); printf(S %d enter Cn,serialNum); sleep(2); pthr
3、ead_mutex_unlock(&s1); pthread_mutex_lock(&s2); printf(S %d enter Bn,serialNum); sleep(2); pthread_mutex_unlock(&s2); pthread_mutex_lock(&s3); printf(S %d enter An,serialNum); sleep(2); printf(S %d leave An,serialNum); printf(!S finished onen); sleep(2); pthread_mutex_unlock(&s3); void *e(void *a2)
4、/东边来的汽车 int serialNum=*(int*)a2); pthread_mutex_lock(&s2); printf(E %d enter Bn,serialNum); sleep(2); pthread_mutex_unlock(&s2); pthread_mutex_lock(&s3); printf(E %d enter An,serialNum); sleep(2); pthread_mutex_unlock(&s3); pthread_mutex_lock(&s4); printf(E %d enter Dn,serialNum); sleep(2); printf(E
5、 %d leave Dn,serialNum); printf(!E finished one n); sleep(2); pthread_mutex_unlock(&s4); void *w(void *a3) /西边来的汽车 int serialNum=*(int*)a3); pthread_mutex_lock(&s4); printf(W %d enter Dn,serialNum); sleep(2); pthread_mutex_unlock(&s4); pthread_mutex_lock(&s1); printf(W %d enter Cn,serialNum); sleep(
6、2); printf(W %d leave Cn,serialNum); printf(!W finished one n); sleep(2); pthread_mutex_unlock(&s1); int main(int argc,char *argv) int c; printf(Please input the integer number,less than 7: );/车流量 scanf(%d,&c); if( c Max ) printf(You enter the wrong number,try again.n); exit(1); int i1 = pthread_mut
7、ex_init(&s1,NULL); /线程互斥信号量创建及初始化 if(i1 != 0) printf(Create error.); exit(1); int i2 = pthread_mutex_init(&s2,NULL); if(i2 != 0) printf(Create error.); exit(1); int i3 = pthread_mutex_init(&s3,NULL); if(i3 != 0) printf(Create error.); exit(1); int i4 = pthread_mutex_init(&s4,NULL); if(i4 != 0) print
8、f(Create error.); exit(1); for(i = 1;i = c; i+) int* iaddr=&i;/汽车序号 pthread_create(&Wi-1,NULL,(void *)w,(void *)iaddr);/创建线程 pthread_create(&Ei-1,NULL,(void *)e,(void *)iaddr); pthread_create(&Si-1,NULL,(void *)s,(void *)iaddr); sleep(5); for(i = 0; i c; i+) pthread_join(Wi,NULL);/当前线程等待Wi线程终止 pthread_join(Ei,NULL); pthread_join(Si,NULL); exit(0); /main进程结束 程序运行结果: 总结及进一步改善建议: 通过本次实验,我更进一步认识死锁的发生条件和预防死锁发生的方法,线程的种类,和线程创建及管理机制。死锁发生的条件有互斥条件,占有且等待条件,不可抢占条件等。我们只要破坏死锁发生条件之一我们就可以预防死锁的发生!本实验采用破坏占有且等待条件预防死锁发生!