#linux内核之旅#通过生产者与消费者模型感受死锁——西邮本科生的实验( 二 )


五.附录:源代码(电子版)

# include<stdio.h> # include<stdlib.h> # include<unistd.h> # include<pthread.h> # include<semaphore.h> # defineM 1 # defineP(x) sem_wait(&x) # defineV(x) sem_post(&x)
intin = 0; intout = 0; intbuff[M] = { 0};
sem_tsem_dr; sem_tsem_co; pthread_mutex_tmutex;
voidprint{ staticintnumber = 0; inti; printf( "(%2d)t",number); for(i = 0; i < M; i++) printf( "%d ", buff[i]); number++; printf( "n"); }
void* producer{ for(;;) { sleep( 1); P(sem_dr); pthread_mutex_lock(&mutex);in = in % M; printf( "(+)produce a product. buffer:"); buff[in] = 1; print; ++in;pthread_mutex_unlock(&mutex); V(sem_co); }}
void* consumer{ for(;;) { sleep( 1); pthread_mutex_lock(&mutex); P(sem_co);out = out % M; printf( "(-)consume a product. buffer:"); buff[out] = 0; print; ++out;pthread_mutex_unlock(&mutex); V(sem_dr); }}
voidsem_mutex_init{ intinit1 = sem_init(&sem_dr, 0, M); intinit2 = sem_init(&sem_co, 0, 0); if( (init1 != 0) && (init2 != 0)) { printf( "sem init failed n"); exit( 1); } intinit3 = pthread_mutex_init(&mutex, NULL); if(init3 != 0) { printf( "mutex init failed n"); exit( 1); } }
intmain{ pthread_tid1; pthread_tid2; inti; intret; sem_mutex_init; /*create the producer thread*/ret = pthread_create(&id1, NULL, producer, NULL); if(ret != 0) { 【#linux内核之旅#通过生产者与消费者模型感受死锁——西邮本科生的实验】printf( "producer creation failed n"); exit( 1); } ret = pthread_create(&id2, NULL, consumer, NULL); if(ret != 0) {printf( "consumer creation failed n"); exit( 1); } pthread_join(id1, NULL); pthread_join(id2, NULL); exit( 0); }


推荐阅读