嗨很抱歉发布了一大堆代码,但我是C代码的新手,基本上我正在做大学的任务,我必须实现一个“pthread_barrier”,现在我理解了障碍的概念(或者在至少我认为我这样做但是我只是不确定我应该把它放在哪里.作业说明:
“使用pthread_barrier_init和pthread_barrier_wait确保所有生产者/消费者线程同时开始生产/消费.”
顺便说一下,这是作业的额外学分
#include <pthread.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> #define SIXTY_SECONDS 60000000 #define ONE_SECOND 1000000 #define RANGE 10 #define PERIOD 2 typedef struct { int *carpark; int capacity; int occupied; int nextin; int nextout; int cars_in; int cars_out; pthread_mutex_t lock; pthread_cond_t space; pthread_cond_t car; pthread_barrier_t bar; } cp_t; /* Our producer threads will each execute this function */ static void * producer(void *cp_in) { cp_t *cp; unsigned int seed; /* Convert what was passed in to a pointer to a bounded buffer */ cp = (cp_t *)cp_in; /* Loop */ while (1) { /* Sleep for up to 1s */ usleep(rand_r(&seed) % ONE_SECOND); /* Acquire the lock */ pthread_mutex_lock(&cp->lock); /* While full wait until there is room available */ while (cp->occupied == cp->capacity) { pthread_cond_wait(&cp->car,&cp->lock); } /* Insert an item */ cp->carpark[cp->nextin] = rand_r(&seed) % RANGE; /* Increment counters */ cp->occupied++; cp->nextin++; cp->nextin %= cp->capacity; cp->cars_in++; /* Someone may be waiting on data to become available */ pthread_cond_signal(&cp->space); /* Release the lock */ pthread_mutex_unlock(&cp->lock); } return ((void *)NULL); } /* Our consumer threads will each execute this function */ static void * consumer(void *cp_in) { cp_t *cp; unsigned int seed; /* Convert what was passed in to a pointer to a bounded buffer */ cp = (cp_t *)cp_in; while (1) { /* Sleep for up to 1s */ usleep(rand_r(&seed) % ONE_SECOND); /* Acquire the lock */ pthread_mutex_lock(&cp->lock); /* While empty wait until there is data available */ while (cp->occupied == 0) { pthread_cond_wait(&cp->space,&cp->lock); } /* Increment counters */ cp->occupied--; cp->nextout++; cp->nextout %= cp->capacity; cp->cars_out++; /* Someone may be waiting on room to become available */ pthread_cond_signal(&cp->car); /* Release the lock */ pthread_mutex_unlock(&cp->lock); } return ((void *)NULL); } /* Our monitor thread will each execute this function */ static void * monitor(void *cp_in) { cp_t *cp; /* Convert what was passed in to a pointer to a bounded buffer */ cp = (cp_t *)cp_in; while (1) { /* Pause */ sleep(PERIOD); /* Acquire the lock */ pthread_mutex_lock(&cp->lock); printf("Delta: %d\n",cp->cars_in - cp->cars_out); /* Release the lock */ pthread_mutex_unlock(&cp->lock); } return ((void *)NULL); } /* Initialisation */ static int init(cp_t *cp,int capacity) { /* Set up the bounded buffer internals */ cp->occupied = cp->nextin = cp->nextout = cp->cars_in = cp->cars_out = 0; cp->capacity = capacity; /* Initialise our data structure */ cp->carpark = (int *)malloc(cp->capacity * sizeof (*cp->carpark)); /* Check malloc succeeded */ if (cp->carpark == NULL) { perror("malloc()"); exit(EXIT_FAILURE); } /* Initialise lock and condition variables */ pthread_mutex_init(&cp->lock,NULL); pthread_cond_init(&cp->space,NULL); pthread_cond_init(&cp->car,NULL); /* Seed random number generator */ srand((unsigned int)getpid()); return (0); } int main(int argc,char *argv[]) { pthread_t p,c,m; cp_t cp; /* Check usage */ if (argc != 2) { printf("Usage: %s buffer_size\n",argv[0]); exit(EXIT_FAILURE); } /* Initialise */ init(&cp,atoi(argv[1])); /* Create our threads */ pthread_create(&p,NULL,producer,(void *)&cp); pthread_create(&p,(void *)&cp); pthread_create(&c,consumer,(void *)&cp); pthread_create(&m,monitor,(void *)&cp); /* Wait for our threads */ pthread_join(p,NULL); pthread_join(p,NULL); pthread_join(c,NULL); pthread_join(m,NULL); return (0); }