下面是删除了条件变量的代码:
#include
typedef struct Node { int data; struct Node *next; } Node;
typedef struct Buffer { Node *head; Node *tail; int size; pthread_mutex_t mutex; sem_t empty; //定义空缓冲区信号量 sem_t full; //定义满缓冲区信号量 } Buffer;
int length[MAX_BUFFER_SIZE]; void buffer_init(Buffer *buffer) { buffer->head = NULL; buffer->tail = NULL; buffer->size = 0; pthread_mutex_init(&(buffer->mutex), NULL); sem_init(&(buffer->empty), 0, MAX_BUFFER_SIZE); //初始化空缓冲区信号量为MAX_BUFFER_SIZE sem_init(&(buffer->full), 0, 0); //初始化满缓冲区信号量为0 }
void buffer_put(Buffer *buffer, int data) { sem_wait(&(buffer->empty)); //等待空缓冲区信号量 pthread_mutex_lock(&(buffer->mutex)); Node *node = (Node *)malloc(sizeof(Node)); node->data = data; node->next = NULL; if (buffer->tail == NULL) { buffer->head = node; buffer->tail = node; } else { buffer->tail->next = node; buffer->tail = node; } buffer->size++; printf(“Produced %d (buffer size: %d)\n”, data, buffer->size); pthread_mutex_unlock(&(buffer->mutex)); sem_post(&(buffer->full)); //增加满缓冲区信号量 usleep(rand()%111111); }
int buffer_get(Buffer *buffer) { sem_wait(&(buffer->full)); //等待满缓冲区信号量 pthread_mutex_lock(&(buffer->mutex)); Node *node = buffer->head; int data = node->data; buffer->head = node->next; if (buffer->head == NULL) { buffer->tail = NULL; } buffer->size–; printf(“Consumed %d (buffer size: %d)\n”, data, buffer->size); free(node); pthread_mutex_unlock(&(buffer->mutex)); sem_post(&(buffer->empty)); //增加空缓冲区信号量 usleep(rand()%100000); return data; }
void *producer(void *arg) { Buffer *buffer = (Buffer *)arg; time_t start_time = time(NULL); for (int i = 0;difftime(time(NULL), start_time) <=100; i++) {
buffer_put(buffer, i);
} printf(“producers were tied! Stop the project.\n”); exit(0); return NULL;
}
void *consumer(void *arg) { Buffer *buffer = (Buffer *)arg; for (int i = 0; ; i++) { buffer_get(buffer); } return NULL; }
int main() { Buffer buffer; buffer_init(&buffer);
pthread_t producer_thread; pthread_t consumer_thread;
pthread_create(&producer_thread, NULL, producer, &buffer); pthread_create(&consumer_thread, NULL, consumer, &buffer);
pthread_join(producer_thread, NULL); pthread_join(consumer_thread, NULL);
return 0;
}