以生产者/消费者模型为依据,在 linux 环境下创建一个控制台进程,在该进 程中创建 n 个线程模拟生产者和消费者,实现进程(线程)的同步与互斥。
时间: 2024-02-15 17:04:14 浏览: 78
好的,这是一个经典的多线程同步与互斥的问题,常用的解决方案是使用信号量。
在 Linux 环境下,我们可以使用 pthread 库来创建线程,使用信号量来实现线程同步与互斥。
下面是一个简单的实现过程:
1. 首先需要定义一个结构体来存储生产者和消费者的信息,包括缓冲区指针、缓冲区大小、生产者和消费者数量等信息。
```
typedef struct {
int *buffer;
int bufferSize;
int numProducers;
int numConsumers;
} ProducerConsumerData;
```
2. 接下来,我们需要定义两个信号量,一个用于表示缓冲区中可用的数据数量,另一个用于表示缓冲区中空闲的空间数量。
```
sem_t full;
sem_t empty;
```
3. 然后,我们需要定义一个互斥锁,用于保护缓冲区的访问。
```
pthread_mutex_t mutex;
```
4. 在控制台进程中,我们需要初始化信号量和互斥锁,并创建生产者和消费者线程。
```
int main() {
// 初始化生产者消费者数据
ProducerConsumerData data;
data.bufferSize = 10;
data.buffer = (int*) malloc(data.bufferSize * sizeof(int));
data.numProducers = 2;
data.numConsumers = 2;
// 初始化信号量和互斥锁
sem_init(&full, 0, 0);
sem_init(&empty, 0, data.bufferSize);
pthread_mutex_init(&mutex, NULL);
// 创建生产者和消费者线程
pthread_t producerThread[data.numProducers];
pthread_t consumerThread[data.numConsumers];
for (int i = 0; i < data.numProducers; i++) {
pthread_create(&producerThread[i], NULL, producer, &data);
}
for (int i = 0; i < data.numConsumers; i++) {
pthread_create(&consumerThread[i], NULL, consumer, &data);
}
// 等待线程结束
for (int i = 0; i < data.numProducers; i++) {
pthread_join(producerThread[i], NULL);
}
for (int i = 0; i < data.numConsumers; i++) {
pthread_join(consumerThread[i], NULL);
}
// 销毁信号量和互斥锁
sem_destroy(&full);
sem_destroy(&empty);
pthread_mutex_destroy(&mutex);
return 0;
}
```
5. 接下来,我们需要定义生产者和消费者线程的函数。生产者线程先等待空闲的空间,然后获取互斥锁,将数据写入缓冲区,并通知消费者有新的数据可用。消费者线程先等待可用的数据,然后获取互斥锁,从缓冲区中读取数据,并通知生产者有新的空闲空间可用。
```
void *producer(void *arg) {
ProducerConsumerData *data = (ProducerConsumerData*) arg;
int value = 0;
while (1) {
// 等待空闲空间
sem_wait(&empty);
// 获取互斥锁,写入数据
pthread_mutex_lock(&mutex);
data->buffer[value % data->bufferSize] = value;
printf("Producer %ld: %d\n", pthread_self(), value);
value++;
// 释放互斥锁,通知消费者有新的数据可用
pthread_mutex_unlock(&mutex);
sem_post(&full);
}
}
void *consumer(void *arg) {
ProducerConsumerData *data = (ProducerConsumerData*) arg;
int value = 0;
while (1) {
// 等待可用数据
sem_wait(&full);
// 获取互斥锁,读取数据
pthread_mutex_lock(&mutex);
int dataValue = data->buffer[value % data->bufferSize];
printf("Consumer %ld: %d\n", pthread_self(), dataValue);
value++;
// 释放互斥锁,通知生产者有新的空闲空间可用
pthread_mutex_unlock(&mutex);
sem_post(&empty);
}
}
```
以上就是一个简单的生产者/消费者模型的实现,使用信号量和互斥锁来保证多线程的同步与互斥。
阅读全文