#include <stdlib.h> /*malloc函数调用*/
#include <pthread.h> /*线程的互斥量的系统调用*/
struct foo{ /*为了对一个数据结构的互斥访问*/
int count; /*便于利用互斥量*/
pthread_mutex_t mutex; /*用count的目的是,用于记录目前所有线程对该结构对象的引用数量*/
/*other struction*/ /*防止在仍有线程作用于该结构对象等待拿锁,就释放了内存*/
};
struct foo * /*这个函数的作用是分配一个对象,并且对该对象进行了初始化工作*/
foo_alloc(void) /*而不是仅仅做一个对象的初始化工作,所以其参数是void而非一个对象*/
{
struct foo *fp;
if((fp=malloc(sizeof(struct foo)))!=NULL);
{
fp->count = 1; /*count等于1,而且不需要加锁,因为是刚刚建立*/
if(pthread_mutex_init(&fp->mutex,NULL)!=0)
{
free(fp); /*如果互斥量初始化失败需要对已经分配对象进行释放内存再返回*/
return(NULL); /*否则将会造成内存泄露*/
}
/*initilize other parts*/
}
return (fp); /*把return放在这个部分,即使分配对象失败也不用担心*/
}
void
mutex_hold(struct foo *fp) /*在访问count时要加锁,而在引用一个对象时要调用该函数*/
{
pthread_mutex_lock(&fp->mutex);
fp->count++;
pthread_mutex_unlock(&fp->mutex);
}
void
mutex_rele(struct foo *fp) /*访问完一个对象后,要调用该函数*/
{
pthread_mutex_lock(&fp->mutex); /*这个锁的作用是对lock与unlock之间的资源进行互斥访问*/
if(--fp->count==0){
pthread_mutex_destroy(&fp->mutex);
free(fp);
}else {
pthread_mutex_unlock(&fp->mutex);
}
}
总结:互斥量的作用就是对pthread_mutex_lock和pthread_mutex_unlock间的资源进行互斥访问。
这个数据结构中之所以有互斥量,目的是对该结构对象的一些操作代码可能需要互斥的使用。
参考文献:《UNIX环境高级编程》第二版。