#include <stdlib.h>
#include <pthread.h>
#include <stdio.h>
struct foo {
int f_count;
pthread_mutex_t f_lock;
/* ... more stuff here ... */
};
struct foo *
foo_alloc(void) /* allocate the object */
{
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);
}
void
foo_hold(struct foo *fp) /* add a reference to the object */
{
pthread_mutex_lock(&fp->f_lock);
fp->f_count++;
pthread_mutex_unlock(&fp->f_lock);
}
void
foo_rele(struct foo *fp) /* release a reference to the object */
{
pthread_mutex_lock(&fp->f_lock);
if (--fp->f_count == 0) { /* last reference */
pthread_mutex_unlock(&fp->f_lock);
pthread_mutex_destroy(&fp->f_lock);
free(fp);
} else {
pthread_mutex_unlock(&fp->f_lock);
}
}
int data=80;
//pointer.f_lock=PTHREAD_MUTEX_INITIALIZER;
void *func1(void *arg)
{
struct foo *pointer;
pointer=foo_alloc();
foo_hold(pointer);
data=60;
sleep(1);
printf("thread id1=%u,data=%d\n",pthread_self(),data);
foo_rele(pointer);
pthread_exit((void *)1);
}
void *func2(void *arg)
{
data=40;
sleep(1);
printf("thread id2=%u,data=%d\n",pthread_self(),data);
pthread_exit((void *)2);
}
int main()
{
pthread_t tid1,tid2;
pthread_create(&tid1,NULL,func1,NULL);
printf("thread id0=%u,data=%d\n",pthread_self(),data);
sleep(1);
pthread_create(&tid2,NULL,func2,NULL);
data=20;
printf("thread id0=%u,data=%d\n",pthread_self(),data);
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
return 0;
}