阅读量:0
在C语言中,处理多线程通常需要使用线程库,如POSIX线程(pthread)库。下面是一个简单的示例,展示了如何使用pthread库创建多个线程并执行队列操作。
首先,确保你的系统支持pthread库。然后,创建一个名为queue.h
的头文件,用于定义队列结构和相关的函数原型:
#ifndef QUEUE_H #define QUEUE_H typedef struct { int *data; int front; int rear; int size; int capacity; } Queue; Queue* createQueue(int capacity); void enqueue(Queue *queue, int item); int dequeue(Queue *queue); int isFull(Queue *queue); int isEmpty(Queue *queue); #endif
接下来,创建一个名为queue.c
的文件,用于实现队列结构和相关的函数:
#include <stdio.h> #include <stdlib.h> #include "queue.h" Queue* createQueue(int capacity) { Queue *queue = (Queue *)malloc(sizeof(Queue)); queue->capacity = capacity; queue->front = queue->size = 0; queue->rear = capacity - 1; queue->data = (int *)malloc(queue->capacity * sizeof(int)); return queue; } void enqueue(Queue *queue, int item) { if (isFull(queue)) { printf("Queue is full\n"); return; } queue->rear = (queue->rear + 1) % queue->capacity; queue->data[queue->rear] = item; queue->size = queue->size + 1; } int dequeue(Queue *queue) { if (isEmpty(queue)) { printf("Queue is empty\n"); return -1; } int item = queue->data[queue->front]; queue->front = (queue->front + 1) % queue->capacity; queue->size = queue->size - 1; return item; } int isFull(Queue *queue) { return (queue->size == queue->capacity); } int isEmpty(Queue *queue) { return (queue->size == 0); }
然后,创建一个名为main.c
的文件,用于创建多个线程并执行队列操作:
#include <stdio.h> #include <stdlib.h> #include <pthread.h> #include "queue.h" Queue *queue; pthread_mutex_t lock; void *producer(void *arg) { for (int i = 1; i <= 10; i++) { pthread_mutex_lock(&lock); enqueue(queue, i); printf("Produced: %d\n", i); pthread_mutex_unlock(&lock); } return NULL; } void *consumer(void *arg) { for (int i = 0; i < 10; i++) { pthread_mutex_lock(&lock); int item = dequeue(queue); printf("Consumed: %d\n", item); pthread_mutex_unlock(&lock); } return NULL; } int main() { queue = createQueue(5); pthread_t producerThread, consumerThread; pthread_mutex_init(&lock, NULL); pthread_create(&producerThread, NULL, producer, NULL); pthread_create(&consumerThread, NULL, consumer, NULL); pthread_join(producerThread, NULL); pthread_join(consumerThread, NULL); pthread_mutex_destroy(&lock); free(queue->data); free(queue); return 0; }
在这个示例中,我们创建了一个具有5个元素的队列,并使用两个线程分别执行生产者(producer)和消费者(consumer)操作。我们使用互斥锁(pthread_mutex_t)来确保在多线程环境下对队列的安全访问。
要编译和运行此示例,请使用以下命令:
gcc -o main main.c queue.c -lpthread ./main
这将输出生产者和消费者线程交替执行的队列操作。