I am trying to understand deadlock with simple example using two resources rs1 and rs2, both has their own mutex locks, so proc1 locks resource1 and trying to get resource2, at the same time proc2 locks resource2 and trying to get resource1, so both are in deadlock. Following program shows deadlock scenario, but the problem is why both "p1 trying to get rs2" and "p2 tying to get rs1" are not printing by proc1 and proc2 respectively...
#include<pthread.h>
#include<stdio.h>
#include<stdlib.h>
pthread_mutex_t resource1,resource2;
int test=0;
void *proc1()
{
printf("\nThis is proc1 using rs1");
pthread_mutex_lock(&resource1);
usleep(200);
printf("\np1 trying to get rs2...");
pthread_mutex_lock(&resource2);
test++;
printf("\nproc1 got rs2!!");
pthread_mutex_unlock(&resource2);
pthread_mutex_unlock(&resource1);
return 0;
}
void *proc2()
{
printf("\nThis is proc2 using rs2");
pthread_mutex_lock(&resource2);
usleep(200);
printf("\np2 trying to get rs1...");
pthread_mutex_lock(&resource1);
test--;
printf("\nproc2 got rs1!!");
pthread_mutex_unlock(&resource1);
pthread_mutex_unlock(&resource2);
return 0;
}
int main(){
pthread_t t1,t2;
pthread_mutex_init(&resource1, NULL);
pthread_mutex_init(&resource2, NULL);
pthread_create(&t1,NULL, proc1 , NULL);
pthread_create(&t2,NULL, proc2 , NULL);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
// will never arrive here
pthread_mutex_destroy(&resource1);
pthread_mutex_destroy(&resource2);
}
//This program executes in order, have a look
pthread_mutex_t lock1, lock2;
void *resource1(){
pthread_mutex_lock(&lock1);
printf("Job started in resource1..\n");
sleep(2);
printf("Trying to get resourc2\n");
pthread_mutex_lock(&lock2);
printf("Aquired resourc2\n");
pthread_mutex_unlock(&lock2);
printf("Job finished in resource1..\n");
pthread_mutex_unlock(&lock1);
pthread_exit(NULL);
}
void *resource2(){
pthread_mutex_lock(&lock2);
printf("Job started in resource2..\n");
sleep(2);
printf("Trying to get resourc1\n");
pthread_mutex_lock(&lock1);
printf("Aquired resourc1\n");
pthread_mutex_unlock(&lock1);
printf("Job finished in resource2..\n");
pthread_mutex_unlock(&lock2);
pthread_exit(NULL);
}
int main() {
pthread_mutex_init(&lock1,NULL);
pthread_mutex_init(&lock2,NULL);
pthread_t t1,t2;
pthread_create(&t1,NULL,resource1,NULL);
pthread_create(&t2,NULL,resource2,NULL);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
return 0;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With