Linux系统线程死锁实验报告.doc
文本预览下载声明
实验四 Linux系统线程死锁实验报告
关键问题:实例可能会发生死锁,要求修改实例,预防死锁发生
设计思路:采用破坏占有且等待条件预防死锁发生!其中采用“空手申请资源策略预防死锁,即每个进程仅在它不占有资源时才可以申请资源。一个进程可能需要申请并使用某些资源,在它申请另外附加资源前必须先释放当前分到的全部资源!
实现的关键代码:
#includestdio.h
#includestdlib.h
#includeunistd.h
#includesemaphore.h
#define Max 7
pthread_t E[Max];//从东方来的汽车。每辆汽车对应一个线程。pthread_t W[Max];//从西方来的汽车pthread_t S[Max];//从南方来的汽车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 C\n,serialNum);
sleep(2);
pthread_mutex_unlock(s1);
pthread_mutex_lock(s2);
printf(S %d enter B\n,serialNum);
sleep(2);
pthread_mutex_unlock(s2);
pthread_mutex_lock(s3);
printf(S %d enter A\n,serialNum);
sleep(2);
printf(S %d leave A\n,serialNum);
printf(!!!S finished one\n);
sleep(2);
pthread_mutex_unlock(s3);
}
void *e(void *a2) //东边来的汽车{
int serialNum=*((int*)a2);
pthread_mutex_lock(s2);
printf(E %d enter B\n,serialNum);
sleep(2);
pthread_mutex_unlock(s2);
pthread_mutex_lock(s3);
printf(E %d enter A\n,serialNum);
sleep(2);
pthread_mutex_unlock(s3);
pthread_mutex_lock(s4);
printf(E %d enter D\n,serialNum);
sleep(2);
printf(E %d leave D\n,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 D\n,serialNum);
sleep(2);
pthread_mutex_unlock(s4);
pthread_mutex_lock(s1);
printf(W %d enter C\n,serialNum);
sleep(2);
printf(W %d leave C\n,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_mutex_
显示全部