多线程属性类型分为4中,正常的非递归,递归,默认,以及具有死锁检查机制.
递归和非递归的区别:
非递归:当一个线程已获得锁,其他线程阻塞,不允许该线程获得锁两次,否则死锁.
递归:允许该线程获得锁多次,只要释放锁的次数等于获得锁的次数即可.
那可能你会问,这有什么用呢?
下面我就用程序来演示给你看.
#include<pthread.h>
#include<stdio.h>
#include<errno.h>
#include<stdlib.h>
#
pthread_mutex_t lock;
int value0 = 1;
int value1 = 2;
int func(void)
{
int ret, val;
ret = pthread_mutex_lock(&lock);
checkResults("func : lock", ret);
val = value1 + 10;
ret = pthread_mutex_unlock(&lock);
checkResults("func :unlock", ret);
return val;
}
void *test0(void *arg)
{
int ret;
sleep(3);
ret =pthread_mutex_lock(&lock);
checkResults("lock:", ret);
value0 = func();
printf("res=%d\n", value0);
ret = pthread_mutex_unlock(&lock);
checkResults("unlock:", ret);
return NULL;
}
void checkResults(const char *s, int ret)
{
if(ret != 0)
{
fprintf(stderr, "%s%s\n",s,strerror(ret));
}
}
void *test1(void *arg)
{
sleep(1);
int ret = pthread_mutex_lock(&lock);
checkResults("1:", ret);
printf("value0=%d\n", value0);
ret = pthread_mutex_unlock(&lock);
checkResults("1:unlock", ret);
return NULL;
}
int main()
{
int ret;
pthread_t tid[2];
pthread_attr_t attr;
pthread_mutexattr_t mutexattr;
pthread_attr_init(&mutexattr);
pthread_mutexattr_init(&mutexattr);
//pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_ERRORCHECK);
//pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_NORMAL);
pthread_mutex_init(&lock, &mutexattr);
pthread_mutexattr_destroy(&mutexattr);
ret = pthread_create(&tid[0], &attr, test0, NULL);
checkResults("create:", ret);
ret = pthread_create(&tid[1], &attr, test1, NULL);
checkResults("create:", ret);
pthread_attr_destroy(&attr);
pthread_exit(NULL);
}
通过一下三种不同的设置我们发现,第三个就发生死锁了,第一个通知你有死锁发生.
//pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_ERRORCHECK);
//pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_NORMAL);