程序用来模拟生产者和消费者问题,开了两个线程,一个是生产者用来往数组里面写数据(生产),另一个从数组读数据(消费),用一个互斥量进行线程的同步,即写数据的时候不要同时允许读数据,反之亦然。
用两个信号量同步数据读写,有数据可用时允许读,否则挂起,有空闲的存储空间时可以写数据,否则挂起。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
#include<errno.h>
#include<fcntl.h>
#include<semaphore.h>
#include<sys/ipc.h>
#include<math.h>
#include<string.h>
#define N 10
short buf[10];
void productor(void *arg);
void consumer(void *arg);
int readsize=0;
int writesize=0;
short data=1;
time_t end_time;
sem_t full,avaible,mutex;
int main(void)
{
pthread_t id1,id2;
int ret;
end_time=time(NULL)+40;
ret=sem_init(&mutex,0,1);//线程同步,
ret=sem_init(&full,0,0);//现在有多少可用数据
ret=sem_init(&avaible,0,N);//还可以放多少数据进去
memset(buf,0,N*sizeof(short));
if(ret!=0)
perror("sem_init");
ret=pthread_create(&id1,NULL,(void *)productor,NULL);//生产者线程
if(ret!=0)
perror("pthread create");
ret=pthread_create(&id2,NULL,(void *)consumer,NULL);//消费者线程
if(ret!=0)
perror("pthread create");
pthread_join(id1,NULL); //等待线程结束,释放资源
pthread_join(id2,NULL);
exit(0);
}
void productor(void *arg)
{
int tmp;
if(time(NULL)>end_time)
pthread_exit(0);
while(time(NULL)<end_time)
{
sem_wait(&mutex); //生产者写数据时,消费者就等一会儿吧
sem_wait(&avaible);//看看是否有空闲的位置存放数据,如果没有,生产者就不要生产了,休息一会儿吧
buf[writesize++]=data++;
printf("producor...now buf[%d] is wrote :%d.....\n\n",tmp=writesize-1,tmp=data-1);
writesize=writesize%N;
sem_post(&full);//只少有一个数据可用,消费者如果要消费,是可以的
sem_post(&mutex);//消费者允许消费了
sleep(1);
}
}
void consumer(void *arg)
{
int tmp,tmp_data;
if(time(NULL)>end_time)
pthread_exit(0);
while(time(NULL)<end_time)
{
sem_wait(&mutex);//消费者消费的同时,生产者就不要生产了,或者说即使生产了也不要往里面放,那样会把事情搅乱
sem_wait(&full);//看看是否有数据可用,如果没有就不要消费了,因为没有东西可消费的
tmp_data=buf[readsize++];
printf("now buf[%d] is read :%d.....\n\n",tmp=readsize-1,tmp_data);
readsize=readsize%N;
sem_post(&avaible);//消费者消费了一些东西,有空闲释放,生产者是允许生产的
sem_post(&mutex);//生产者允许往里面送数据了
sleep(2);
}
}