C语言。编写一个程序,实现如下功能:包含一个生产者线程和一个消费者线程,它们有一个共享缓冲区;共享缓冲区是一个长度为10的字符型数组,该数组为全局变量;生产者从键盘获取一个用户输入的字符串(长度不超过255字符),然后将字符串逐字符地存入共享缓冲区;消费者从共享缓冲区中逐字符地读取并打印字符;当检测到输入字符串中的‘!”时,结束程序。
时间: 2024-02-16 12:00:12 浏览: 10
以下是一个实现该功能的C语言程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#define BUFFER_SIZE 10
char buffer[BUFFER_SIZE];
int in = 0, out = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t empty = PTHREAD_COND_INITIALIZER;
pthread_cond_t full = PTHREAD_COND_INITIALIZER;
void *producer(void *arg) {
char input[256];
printf("Producer started!\n");
while (1) {
fgets(input, 256, stdin);
int len = strlen(input);
if (len == 1 && input[0] == '\n') continue; // 忽略空行
pthread_mutex_lock(&mutex);
for (int i = 0; i < len; i++) {
while ((in + 1) % BUFFER_SIZE == out) {
pthread_cond_wait(&empty, &mutex);
}
buffer[in] = input[i];
in = (in + 1) % BUFFER_SIZE;
pthread_cond_signal(&full);
if (input[i] == '!' || input[i] == '"') {
pthread_mutex_unlock(&mutex);
printf("Producer ended!\n");
pthread_exit(NULL);
}
}
pthread_mutex_unlock(&mutex);
}
}
void *consumer(void *arg) {
printf("Consumer started!\n");
while (1) {
pthread_mutex_lock(&mutex);
while (in == out) {
pthread_cond_wait(&full, &mutex);
}
putchar(buffer[out]);
out = (out + 1) % BUFFER_SIZE;
pthread_cond_signal(&empty);
pthread_mutex_unlock(&mutex);
}
}
int main() {
pthread_t tid_producer, tid_consumer;
pthread_create(&tid_producer, NULL, producer, NULL);
pthread_create(&tid_consumer, NULL, consumer, NULL);
pthread_join(tid_producer, NULL);
pthread_join(tid_consumer, NULL);
printf("Consumer ended!\n");
return 0;
}
```
上述程序使用了互斥锁和条件变量来实现线程间同步和互斥,保证了共享缓冲区的正确性。其中,生产者线程获取用户输入,并将输入逐字符地存入共享缓冲区,若检测到输入字符串中的'!'或'"'则结束程序。消费者线程从共享缓冲区中逐字符地读取并打印字符,直到生产者线程结束程序。