日期:2014-05-16 浏览次数:21106 次
#include <stdlib.h>
#include <pthread.h>
struct foo
{
    int f_count; //[color=#FF0000]引用计数[/color]
    pthread_mutex_t f_lock;
    /* ... more stuff here ... */
};
struct foo *foo_alloc(void)
{
    struct foo *fp;
    if ((fp = malloc(sizeof(struct foo))) != NULL)
    {
        fp->f_count = 1;
        if (pthread_mutex_init(&fp->f_lock, NULL) != 0)
        {
            free(fp);
            return NULL;
        }
        
        /* ... continue initialization ... */
    }
    return fp;
}
/* add a reference to the object */
void foo_hold(struct foo *fp)
{
    pthread_mutex_lock(&fp->f_lock);
    fp->f_count++;
    pthread_mutex_unlock(&fp->lock);
}
/* release a reference to the object */
void foo_rele(struct foo *fp)
{
    pthread_mutex_lock(&fp->f_lock);
    if (--fp->f_count == 0)
    {
        /* last reference */
        pthread_mutex_unlock(&fp->f_lock);
        //此处刚解锁别的线程恰好就调用了foo_hold会出现什么情况?
        pthread_mutex_destroy(&fp->f_lock);
        free(fp);
    }
    else
    {
        pthread_mutex_unlock(&fp->f_lock);
    }
}