#include"stdio.h" #include"pthread.h" #include"semaphore.h" static int datbuf[10] = {0}; static int n; sem_t sem1,sem2,sem3; void *do_input(void *pvoid) { int i; sem_wait(&sem1); printf("please input data "); for(i = 0;;i++) { scanf("%d",&datbuf[i]); n++; if(getchar()==' ') break; } sem_post(&sem2); pthread_exit(NULL); } void *do_swap(void *pvoid) { int i,j,min; sem_wait(&sem2); printf("data: "); for(i = 0; i<n;i++) { printf(" %d",datbuf[i]); } printf(" swap: "); for(i = 0;i < n;i++) { for(j = 0;j<n-i-1;j++) if(datbuf[j]>datbuf[j+1]) { min = datbuf[j]; datbuf[j] = datbuf[j+1]; datbuf[j+1] = min; } } sem_post(&sem3); pthread_exit(NULL); } void *do_show(void *pvoid) { int i; sem_wait(&sem3); for(i = 0; i<n;i++) { printf(" %d",datbuf[i]); } sem_post(&sem1); pthread_exit(NULL); } int main() { pthread_t tid1,tid2,tid3; int ret; ret = sem_init(&sem1,0,1); ret += sem_init(&sem2,0,0); ret += sem_init(&sem3,0,0); if(ret != 0) { printf("Any semaphore inittialization failed "); return ret; } pthread_create(&tid1,NULL,&do_input,NULL); pthread_create(&tid2,NULL,&do_show,NULL); pthread_create(&tid3,NULL,&do_swap,NULL); pthread_join(tid1,NULL); pthread_join(tid2,NULL); pthread_join(tid3,NULL); return 0; }