1.互斥锁类型
1.普通锁 (PTHREAD_MUTEX_NORMAL)
互斥锁默认类型。当一个线程对一个普通锁加锁以后,其余请求该锁的线程将形成一个等待队列,并在该锁解锁后按照优先级获得它,这种锁类型保证了资源分配的公平性。一个线程如果对一个已经加锁的普通锁再次加锁,将引发死锁;
对一个已经被其他线程加锁的普通锁解锁,或者对一个已经解锁的普通锁再次解锁,将导致不可预期的后果。
2.检错锁(PTHREAD_MUTEX_ERRORCHECK)
一个线程如果对一个已经加锁的检错锁再次加锁,则加锁操作返回EDEADLK;
对一个已经被其他线程加锁的检错锁解锁或者对一个已经解锁的检错锁再次解锁,则解锁操作返回EPERM;
3.嵌套锁(PTHREAD_MUTEX_RECURSIVE)
该锁允许一个线程在释放锁之前多次对它加锁而不发生死锁;
其他线程要获得这个锁,则当前锁的拥有者必须执行多次解锁操作;
对一个已经被其他线程加锁的嵌套锁解锁,或者对一个已经解锁的嵌套锁再次解锁,则解锁操作返回EPERM
4.默认锁(PTHREAD_MUTEX_ DEFAULT)
一个线程如果对一个已经加锁的默认锁再次加锁,或者虽一个已经被其他线程加锁的默认锁解锁,或者对一个解锁的默认锁解锁,将导致不可预期的后果;
这种锁实现的时候可能被映射成上述三种锁之一;
2.死锁举例
1.不同线程申请普通锁,将按照顺序依次申请锁并加锁
#include <pthread.h>
#include <stdio.h>
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
int count = 0;
void * thread_func_one(void *arg)
{
int i;
for(i=0;i<10;i++){
pthread_mutex_lock( &mutex1);
count++;
sleep(1);
pthread_mutex_unlock(&mutex1);
printf("thread one count value is %d/n",count);
}
return NULL;
}
void * thread_func_two(void *arg)
{
int i;
for(i=0;i<10;i++){
pthread_mutex_lock( &mut