?????????????????????????????????????????£?
??????????
????????????????????????????????????????????????????????????????????????????????????????????????????ò??????????????????????????
????pthread_mutex_t
???????????????????????????????????????????????????????mutex????????????????????????????PTHREAD_MUTEX_INITIALIZER???????????????ú?????????????????????
????int pthread_mutex_init(pthread_mutex_t *restrict mutex??
????const pthread_mutexattr_t *restrict attr);
??????????????????????Linux??????man ???????????????÷???????????
??????????????
????int pthread_mutex_lock(pthread_mutex_t *mutex);
??????????????????mutex????????mutex???????????????????????????????????????????????????mutex?????mutex???????
????int pthread_mutex_unlock(pthread_mutex_t *mutex);
??????????????????????????????????????????
????int pthread_mutex_trylock(pthread_mutex_t *mutex);
???????Mutex???????????????????????????????EBUSY??????????????????
????????????
???????????????У???????????????????????????????????????????????????????
????pthread_cond_t    //????????????
???????????mutex??????????ú?????????
????int pthread_cond_init(pthread_cond_t *restrict cond??
????const pthread_condattr_t *restrict attr);
????//?????
????int pthread_cond_wait(pthread_cond_t *restrict cond??
????pthread_mutex_t *restrict mutex);
????????????????
????pthread_cond_wait?????Condition Variable????????????????????????????????:
????1>???Mutex
????2> ???????
????3>?????????????????Mutex???????
???????????????????????????????wait??????????????????????????
????pthread_cond_signal??????Condition Variable????????????????
????int pthread_cond_signal(pthread_cond_t *cond);
????2.????????????????
????????????????????????????????????????????????????????????????????????????????????????????????????Buffer???????????

????????????????????????????????????????????????????????????????????????????????????????????????????
#include<stdio.h>
#include<unistd.h>
#include<pthread.h>
#include<semaphore.h>
#include<stdlib.h>
#define _SIZE_ 64     //???ζ??д?С64
sem_t blank;    //????
sem_t data;     //????
sem_t pro_lock;    //???????????以????????
sem_t con_lock;     //???????????以????????
int ring[_SIZE_];
void* pro_run(void* arg)
{
pthread_detach(pthread_self());
static int i=0;
int id=(int)arg;
while(1)
{
sleep(1);
//      usleep(1000);
sem_wait(&blank);
sem_wait(&pro_lock);
int num=rand()%1000;
ring[i++]=num;
printf("??????%d??????%d??tid:%lu "??id??num??pthread_self());
i%=_SIZE_;
sem_post(&pro_lock);
sem_post(&data);
}
}
void* con_run(void* arg)
{
pthread_detach(pthread_self());
static int i=0;
int id=(int)arg;
while(1)
{
//      sleep(1);
usleep(1000);
sem_wait(&data);
sem_wait(&con_lock);
printf("??????%d?????%d??tid:%lu :"??id??ring[i++]??pthread_self());
i%=_SIZE_;
sem_post(&con_lock);
sem_post(&blank);
}
}
int main()
{
pthread_t producter??consumer??producter1??consumer1;
sem_init(&blank??0??_SIZE_);
sem_init(&data??0??0);
sem_init(&pro_lock??0??1);
sem_init(&con_lock??0??1);
int i=0;
pthread_create(&producter??NULL??pro_run??(void*)i);
pthread_create(&consumer??NULL??con_run??(void*)i);
i++;
pthread_create(&producter1??NULL??pro_run??(void*)i);
pthread_create(&consumer1??NULL??con_run??(void*)i);
sem_destroy(&blank);
sem_destroy(&data);
pthread_join(producter??NULL);
pthread_join(consumer??NULL);
return 0;
}
????semaphore????????????????????sem_t??

????sem_wait????P????????????????????wait??????????????sem_post????V??????????????????????????post???????????????
??????????wait?????post??????????????????1?????????????????????????????????????????????????????????????????????????????Щ??????????????????????????????????????

?????????????????????????????????????????????????????
??????????????????????????????????????????

?????????????佫??????????????????????????????????????????????????????????Щ????????????????????