互斥锁属性创建和销毁
#include<pthread.h>
int pthread_mutexattr_init(pthread_mutexattr_t *attr);
int pthread_mutex_attr_destroy(pthread_mutexattr_t *attr);
返回值:成功返回0,出错返回错误编号
参数:互斥锁属性
互斥锁共享属性操作
#include<pthread.h>
int pthread_mutexattr_getpshared(const pthread_mutexattr_t *attr,int *pshared);
int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr,int pshared);
返回值:成功返回0,出错返回错误编号
参数:
attr:互斥锁属性
pshared:进程共享属性
PTHREAD_PROCESS_PRIVATE(默认情况) 锁只能用于一个进程内部的两个线程 线程进行互斥
PTHREAD_PROCESS_SHARED 锁只能用于两个不同进程中的线程进行互斥
互斥锁类型操作
#include<pthread.h>
int pthread_mutexattr_gettype(const pthread_mutexattr_t *attr, int *kind);
int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int kind);
返回值:成功返回0,出错返回错误编号
参数:
attr:互斥锁属性:
kind:互斥锁类型
标准互斥锁:PTHREAD_MUTEX_NORMAL
(第一次上锁成功,第二次上锁会阻塞)
递归互斥锁:PTHREAD_MUTEX_RECURSIVE
(第一次上锁成功,第二次以后上锁还是成功,内部计数)
检错互斥锁:PTHREAD_MUTEX_ERRORCHECK
(第一次上锁成功,第二次上锁会出错)
默认互斥锁:PTHREAD_MUTEX_DEFAULT
(跟标准互斥锁一样)
示例检测
#include<pthread.h>
#include<iostream>
#include<string.h>
using namespace std;
int main(int argc,char* agr[])
{
pthread_mutex_t mutex; //定义互斥锁对象
//定义(创建)互斥锁属性
pthread_mutexattr_t mutexattr;
//初始化互斥锁属性
pthread_mutexattr_init(&mutexattr);
if(!strcmp(agr[1],"error"))
{
//设置互斥锁类型
pthread_mutexattr_settype(&mutexattr,PTHREAD_MUTEX_ERRORCHECK);//检错互斥锁
}
else if(!strcmp(agr[1],"normal"))
{
pthread_mutexattr_settype(&mutexattr,PTHREAD_MUTEX_NORMAL);//标准互斥锁
}
else if(!strcmp(agr[1],"recursive"))
{
pthread_mutexattr_settype(&mutexattr,PTHREAD_MUTEX_RECURSIVE);//递归互斥锁
}
pthread_mutex_init(&mutex,&mutexattr); //初始化,不是直接NULL了
if(pthread_mutex_lock(&mutex)!=0)
{
cout<<"上锁失败"<<endl;
}
else {
cout<<"上锁成功"<<endl;
}
if(pthread_mutex_lock(&mutex)!=0)
{
cout<<"上锁失败"<<endl;
}
else {
cout<<"上锁成功"<<endl;
}
pthread_mutex_unlock(&mutex); //上两次锁,解两次锁
pthread_mutex_unlock(&mutex);
pthread_mutexattr_destroy(&mutexattr); //销毁互斥锁属性
pthread_mutex_destroy(&mutex); //销毁互斥锁
return 0;
}