1、假设有如下代码
pthread_mutex_t mutex; //代表一个全局互斥对象
void A()
{
mutex.lock();
//这里操作共享数据
B(); //这里调用B方法
mutex.unlock();
return;
}
void B()
{
mutex.lock();
//这里操作共享数据
mutex.unlock();
return;
}
int main()
{
int err;
pthread_t tid1;
pthread_t tid2;
pthread_create(&tid1,NULL,A,NULL);
pthread_create(&tid2,NULL,B,NULL);
return 0;
}
此时会由于在A、B方法中相互等待unlock而导致死锁。
2、假设有如何代码
mutex; //代表一个全局互斥对象
void A()
{
mutex.lock();
//这里操作共享数据
if(.....)
{
return;
}
mutex.unlock();
return;
}
由于在if的执行体内直接retun,而没有调用unlock,导致另一个线程再调用A方法就出现死锁。
参考:http://www.cnblogs.com/lidabo/p/3024829.html
3.我自己又想了个例子,由于多线程下调用fork()之后只有当前进程的控制线程保留下来了,其它线程全部消失,如果其它线程正在持有某个锁,那么由于该线程的死亡它再也没有机会死锁,此时如果子进程的那个唯一线程企图获取那个锁,则必然是死锁。
#include <unistd.h>
#include <stdio.h>
void A()
{
mutex.lock();
sleep(1); //睡一会儿,让线程放弃锁延后一些
mutex.unlock();
return;
}
int main ()
{
pid_t fpid; //fpid表示fork函数返回的值
pthread_mutex_t mutex;
pthread_t tid1;
pthread_create(&tid1,NULL,A,NULL);
fpid=fork();
if (fpid < 0)
printf("error in fork!");
else if (fpid == 0) {
printf("i am the child process, my process id is %d/n",getpid());
mutex.lock(); //由于线程A在子进程中不存在,无法再次获取这个锁,子进程死锁
}
else {
printf("i am the parent process, my process id is %d/n",getpid());
}
return 0;
}
这里有篇博文详细表述了我想的例子
http://blog.csdn.net/hanchaoman/article/details/5685582