线程同步学习1

看下简单的例子:

  1 #include <pthread.h>

  2 #include <stdlib.h>

  3 #include <stdio.h>

  4 #include <unistd.h>

  5 #include <string.h>

  6 

  7 pthread_mutex_t glock = PTHREAD_MUTEX_INITIALIZER;

  8 struct foo

  9 {

 10     int f_count;

 11     pthread_mutex_t f_lock;

 12 };

 13 struct foo* AllocFoo()

 14 {

 15     foo* lpFoo = (foo*)malloc(sizeof(struct foo));

 16     if(NULL != lpFoo)

 17     {

 18         lpFoo->f_count = 1;

 19         if(0 != pthread_mutex_init(&lpFoo->f_lock,NULL))

 20         {

 21             printf("pthread_mutex_init error.\n");

 22             free(lpFoo);

 23             return NULL;

 24         }

 25     }

 26     printf("Alloc a Foo.\n");

 27     return lpFoo;

 28 }

 29 

 30 bool DestoryFoo(foo* apFoo)

 31 {

 32     pthread_mutex_lock(&apFoo->f_lock);

 33     if(--apFoo->f_count == 0)

 34     {

 35         printf("in DestoryFoo: f_coount:%d.\n",apFoo->f_count);

 36         pthread_mutex_unlock(&apFoo->f_lock);

 37         pthread_mutex_destroy(&apFoo->f_lock);

 38         free(apFoo);

 39         printf("Destroy foo.\n");

 40         return true;

 41     }

 42     else

 43     {

 44         printf("in DestoryFoo: f_coount:%d.\n",apFoo->f_count);

 45         pthread_mutex_unlock(&apFoo->f_lock);

 46         return false;

 47     }

 48 }

 49 

 50 void HoldFoo(foo* apFoo)

 51 {

 52     pthread_mutex_lock(&apFoo->f_lock);

 53     ++apFoo->f_count;

 54     printf("in  HoldFoo f_coount:%d.\n",apFoo->f_count);

 55     pthread_mutex_unlock(&apFoo->f_lock);

 56 }

 57 

 58 void PrintTids(const char* s);

 59 

 60 void* ThreadFun(void* Arg)

 61 {

 62     PrintTids("");

 63     foo* lpFoo = (foo*)Arg;

 64     for(int i=0;i<5;++i)

 65     {

 66         //pthread_mutex_lock(&glock);

 67         HoldFoo(lpFoo);

 68         //pthread_mutex_unlock(&glock);

 69     }

 70     return NULL;

 71 }

 72 void PrintTids(const char* s)

 73 {

 74     pid_t lPid = getpid();

 75     pthread_t lTid = pthread_self();

 76     printf("%s pid:%u,tid:(0x%x).\n",s,(unsigned int)lPid, (unsigned int)lTid);

 77 }

 78 int main()

 79 {

 80     foo* lpFoo = AllocFoo();

 81     pthread_t lTid1;

 82     int lErr = pthread_create(&lTid1,NULL,ThreadFun,lpFoo);

 83     if(0 != lErr)

 84     {

 85         exit(1);

 86     }

 87     printf("main thread");

 88 

 89     pthread_t lTid2;

 90     lErr = pthread_create(&lTid2,NULL,ThreadFun,lpFoo);

 91     if(0 != lErr)

 92     {

 93         exit(1);

 94     }

 95     //HoldFoo(lpFoo);

 96     void* lTret;

 97     lErr = pthread_join(lTid1,&lTret);

 98     if(0 != lErr)

 99     {

100         printf("can't join thread1.\n");

101     }

102     lErr = pthread_join(lTid2,&lTret);

103     if(0 != lErr)

104     {

105         printf("can't join thread1.\n");

106     }

107 

108     bool lIsDestory = false;

109     do

110     {

111         lIsDestory = DestoryFoo(lpFoo);

112     }while(!lIsDestory);

113 }

 输出:

线程同步学习1

你可能感兴趣的:(线程同步)