線程同步



#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;
}

發佈了14 篇原創文章 · 獲贊 6 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章