信号量示例,纯信号量#include#include#include#includesem_tremain,apple,pear,mutex;staticunsignedintvremain=20,vapple=0,vpear=0;void*father(void*);void*mother(void*);void*son(void*);void*daughter(void*);voidprint_sem();intmain(){pthread_tfa,ma,so,da;sem_init(&remain,0,20);sem_init(&苹果,0,0);sem_init(&pear,0,0);sem_init(&mutex,0,1);pthread_create(&fa,NULL,&father,NULL);pthread_create(&ma,NULL,&mother,NULL);pthread_create(&so,NULL,&son,NULL);pthread_create(&da,NULL,&daughter,NULL);while(1){sem_wait(&mutex);printf("苹果:%u,梨:%u,左:%u\n",vapple,vpear,vremain);sem_post(&mutex);睡觉(1);}}void*father(void*arg){while(1){sem_wait(&remain);sem_wait(&mutex);printf("father:放在前面,left=%u,apple=%u\n",vremain,vapple);vremain--;vapple++;printf("father:放在后面,left=%u,apple=%u\n\n",vremain,vapple);sem_post(&mutex);sem_post(&apple);sleep(1);}}void*son(void*arg){while(1){sem_wait(&apple);sem_wait(&mutex);printf("son:takebefore,left=%u,apple=%u\n",vremain,vapple);vremain++;vapple--;printf("son:putafter,left=%u,apple=%u\n\n",vremain,vapple);sem_post(&mutex);sem_post(&remain);sleep(3);}}void*mother(void*arg){while(1){sem_wait(&remain);sem_wait(&mutex);printf("mother:putbefore,left=%u,pear=%u\n",vremain,vpear);vremain--;vpear++;printf("mother:putafter,left=%u,pear=%u\n\n",vremain,vpear);sem_post(&mutex);sem_post(&梨);睡觉(3);}}void*daughter(void*arg){while(1){sem_wait(&pear);sem_wait(&mutex);printf("dau:takebefore,left=%u,pear=%u\n",vremain,vpear);剩余++;vpear--;printf("dau:takeafter,left=%u,pear=%u\n\n",vremain,vpear);sem_post(&mutex);sem_post(&remain);睡觉(1);}}信号量和互连锁(副线程序阻塞),非阻塞mainloop#include#include#include#include#includesem_tremain,apple,pear,mutex;staticunsignedintvremain=20,vapple=0,vpear=0;pthread_mutex_t锁;void*father(void*);void*mother(void*);void*son(void*);void*daughter(void*);voidprint_sem();intmain(){intret=0;pthread_tfa,ma,so,da;sem_init(&remain,0,20);sem_init(&苹果,0,0);sem_init(&pear,0,0);sem_init(&mutex,0,1);pthread_mutex_init(&lock,NULL);pthread_create(&fa,NULL,&father,NULL);pthread_create(&ma,NULL,&mother,NULL);pthread_create(&so,NULL,&son,NULL);pthread_create(&da,NULL,&daughter,NULL);while(1){//sem_wait(&mutex);ret=pthread_mutex_trylock(&锁);if(ret!=EBUSY){printf("mainloop:apple:%u,pear:%u,left:%u\n\n",vapple,vpear,vremain);pthread_mutex_unlock(&锁);}else{printf("mainloop:lockisbusy...\n\n");}//sem_post(&mutex);睡眠(1000000);}}void*father(void*arg){while(1){sem_wait(&remain);pthread_mutex_lock(&锁);//sem_wait(&mutex);printf("父亲:放在前面,left=%u,apple=%u\n",vremain,vapple);vremain--;苹果++;printf("父亲:放在后面,left=%u,apple=%u\n\n",vremain,vapple);pthread_mutex_unlock(&锁);//sem_post(&mutex);sem_post(&苹果);睡觉(1);}}void*son(void*arg){while(1){sem_wait(&apple);pthread_mutex_lock(&锁);//sem_wait(&mutex);printf("son:takebefore,left=%u,apple=%u\n",vremain,vapple);剩余++;vapple--;printf("son:放在后面,left=%u,apple=%u\n\n",vremain,vapple);睡觉(1);pthread_mutex_unlock(&锁);//sem_post(&mutex);sem_post(&remain);}}void*mother(void*arg){while(1){sem_wait(&remain);//sem_wait(&mutex);pthread_mutex_lock(&锁);printf("mother:putbefore,left=%u,pear=%u\n",vremain,vpear);vremain--;vpear++;printf("mother:putafter,left=%u,pear=%u\n\n",vremain,vpear);pthread_mutex_unlock(&锁);//sem_post(&互斥量);sem_post(&梨);睡觉(3);}}void*daughter(void*arg){intret=0;while(1){sem_wait(&pear);//sem_wait(&mutex);pthread_mutex_lock(&锁);printf("dau:takebefore,left=%u,pear=%u\n",vremain,vpear);剩余++;vpear--;printf("dau:takeafter,left=%u,pear=%u\n\n",vremain,vpear);pthread_mutex_unlock(&锁);//sem_post(&mutex);sem_post(&remain);睡觉(1);}}