#include<pthread.h> #include<stdlib.h> #include<stdio.h> #include<unistd.h> #include<memory.h> #include<semaphore.h> typedef struct{ int wrok;//线程间通信 标志位 信号灯 int data;//数据 int num; pthread_t rd;//读线程 pthread_t wr;//写线程 sem_t sem;//控制信号量 }PC; void* th_read(void* p){ PC* pc=(PC*)p; while(1){ sem_wait(&(pc->sem)); while(!(pc->wrok)){//写标志,如果写线程没写数据则循环检测是否写好 sem_post(&(pc->sem)); usleep(50000); sem_wait(&(pc->sem)); } printf("read data %d\n",pc->data); pc->data=0;//读完数据删除 pc->wrok=0;//把写标志置位,写线程可以写数据 sem_post(&(pc->sem)); usleep(50000); } } void* th_write(void* p){ PC* pc=(PC*)p; while(1){ sem_wait(&(pc->sem)); pc->wrok=0; //读线程以读完数据,可以写数据了 sleep(1);//模拟去后台获取数据 pc->data=pc->num++;//写数据 pc->wrok=1;//通知读线程可以读了 printf("write %d\n",pc->data); sem_post(&(pc->sem)); usleep(50000); } } void initSem(sem_t* sem){ sem_init(sem,0,1); } void destroySem(sem_t* sem){ sem_destroy(sem); } void startPthread(pthread_t* r,pthread_t* w,PC* p){ pthread_create(r,0,th_read,(void*)p); pthread_create(w,0,th_write,(void*)p); pthread_join(*r,0); pthread_join(*w,0); } //int main(){ // PC pc; // memset(&pc,0,sizeof(PC)); // initSem(&(pc.sem)); // startPthread(&(pc.rd),&(pc.wr),&pc); // destroySem(&(pc.sem)); //}