互斥锁死锁
死锁可以在使用互斥锁的多线程Pthread程序中发生。让我们看看它如何发生。未锁定的互斥锁由pthread_mutex_init()函数初始化。
使用pthread_mutex_lock()和pthread_mutex_unlock()获取并释放互斥锁。如果线程尝试获取锁定的互斥锁,则对pthread_mutex_lock()的调用将阻塞线程,直到互斥锁的所有者调用pthread_mutex_unlock()为止。
让我们举个例子,在下面的代码中创建了两个互斥锁-
/* Create and initialize the mutex locks */ pthread mutex t mutex1; pthread mutex t mutex2; pthread mutex init(&mutex1,NULL); pthread mutex init(&mutex2,NULL);
接下来,创建两个线程(线程1和线程2),并且这两个线程都可以访问两个互斥锁。线程1和线程2分别在函数dosomework_1和dosomework_2中运行,如下所示:
/* thread1 runs in this function */ void *dosomework_1(void *param) { pthread mutex lock(&mutex1); pthread mutex lock(&mutex2); /** * Do some work */ pthread mutex unlock(& mutex2); pthread mutex unlock(& mutex2); pthread exit(0); } /* thread2 runs in this function */ void *dosomework_2(void *param) { pthread mutex lock(&mutex2); pthread mutex lock(&mutex1); /** * Do some work */ pthread mutex unlock(&mutex1); pthread mutex unlock(&mutex2); pthread exit(0); }
在此示例中,thread1尝试按顺序获取互斥锁
互斥锁x1,
互斥锁2,
而线程2尝试按顺序获取互斥锁
互斥锁2,
互斥锁x1,
如果线程1获取互斥x1,而线程2获取互斥x2,则可能发生死锁。即使可能发生死锁,如果在线程2尝试获取锁之前,线程1可以获取并释放互斥锁1和互斥锁2的互斥锁,也不会发生死锁。当然,CPU调度程序会调度线程运行的顺序。上面的示例说明了处理死锁的问题:很难识别和测试仅在某些调度情况下才可能发生的死锁。