经典同步问题linux下的C实现:生产者-消费者问题,读者-写者问题,哲学家问题

1.生产者-消费者问题

/*===============================================================

 * File Name : producerConsumerProblem.c
 * Creation Date : 2013-04-11
 * Last Modified : 2013年04月11日 星期四 20时53分13秒
 * Purpose :test linux semaphore usage

================================================================*/
#include 
#include 
#include 
#include 
#include 

void *producer_handler(void *ptr);
void *consumer_handler(void *ptr);

sem_t mutex,blank,fill;
int *buffer;
int in=0,out=0,buffer_size=10;

void main()
{
	if((buffer=(int *)malloc(buffer_size*sizeof(int)))==NULL)
		printf("can't allocate memroy on heap\n");
	sem_init(&mutex,0,1);
	sem_init(&blank,0,buffer_size);
	sem_init(&fill,0,0);

	int err;
	pthread_t producer,consumer;
	err=pthread_create(&producer,NULL,producer_handler,NULL);
	if(err!=0)
		err_quit("can't create thread: %s\n",strerror(err));
	err=pthread_create(&consumer,NULL,consumer_handler,NULL);
	if(err!=0)
		err_quit("can't create thread: %s\n",strerror(err));

	sleep(10);

}

void *producer_handler(void *ptr)
{
	while(1){
		static int data=0;
		sem_wait(&blank);
	//	sem_wait(&mutex);
	
		buffer[in]=++data;
		printf("%d has been input to the buffer\n",data);
		in=(in+1+buffer_size)%buffer_size;
	//	sem_post(&mutex);
		sem_post(&fill);
		sleep(1);
	}
	return ((void *)0);
}

void *consumer_handler(void *ptr)
{
	while(1){
		int fetch;
		sem_wait(&fill);
	//	sem_wait(&mutex);
		fetch=buffer[out];
		out=(out+1+buffer_size)%buffer_size;
		printf("%d has been fetched\n",fetch);
	//	sem_post(&mutex);
		sem_post(&blank);
		sleep(2);
	}
	return ((void *)0);
}

2.读者-写者问题

/*===============================================================

 * File Name : readerWriterProblem.c
 * Creation Date : 2013-04-11
 * Last Modified : 2013年04月11日 星期四 22时42分45秒
 * Purpose :

================================================================*/

#include 
#include 
#include 
#include 
#include 

#define READER_NUM 5
void *reader_handler(void *ptr);
void *writer_handler(void *ptr);

sem_t write_mutex;
sem_t mutex;
int read_count;

void main()
{
	sem_init(&write_mutex,0,1);
	sem_init(&mutex,0,1);
	read_count=0;
	
	int err,i;
	pthread_t reader[READER_NUM],writer;
	int args[READER_NUM];
	for(i=0;i


3.哲学家进餐问题

有一点要注意:

        就是循环生生成线程时,要给线程处理函数传入计数器参数时,不能直接用计数器的地址——因为计数器会现在主函数中改变。显然也不能用循环中的临时变量来记录。所以只好再有外部数组来记录这些实参值了。

/*===============================================================

 * File Name : dinningPhilosophersProblem.c
 * Creation Date : 2013-04-11
 * Last Modified : 2013年04月11日 星期四 21时34分18秒
 * Purpose :

================================================================*/

#include 
#include 
#include 
#include 
#include 

#define PHILO_NUM 5
void *philosopher(void *arg);

sem_t sema[PHILO_NUM];
sem_t mutex;
void main()
{
	int i,err;
	int args[PHILO_NUM];
	for(i=0;i


 

你可能感兴趣的:(算法,c++)