编写一个程序,POSIX信号量,实现如下功能:包含一个生产者线程和一个消费者线程,它们有一个共享缓冲区;共享缓冲区是一个长度为10的字符型数组,该数组为全局变量;生产者从键盘获取一个用户输入的字符串(长度不超过255字符),然后将字符串逐字符地存入共享缓冲区;消费者从共享缓冲区中逐字符地读取并打印字符;当检测到输入字符串中的‘!’时,退出程序。使用sem_init、sem_wait、sem_post、sem_destroy等函数
时间: 2024-02-28 08:54:16 浏览: 55
好的,我会帮你解答这个问题。
下面是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <string.h>
#define BUFFER_SIZE 10
char buffer[BUFFER_SIZE];
int in = 0;
int out = 0;
sem_t full, empty, mutex;
void *producer(void *arg)
{
char input[255];
while (1) {
printf("Input a string: ");
fgets(input, 255, stdin);
int len = strlen(input);
if (input[len - 1] == '\n') {
input[len - 1] = '\0';
}
for (int i = 0; i < len; i++) {
sem_wait(&empty);
sem_wait(&mutex);
buffer[in] = input[i];
in = (in + 1) % BUFFER_SIZE;
sem_post(&mutex);
sem_post(&full);
if (input[i] == '!') {
return NULL;
}
}
}
}
void *consumer(void *arg)
{
while (1) {
sem_wait(&full);
sem_wait(&mutex);
char c = buffer[out];
out = (out + 1) % BUFFER_SIZE;
sem_post(&mutex);
sem_post(&empty);
printf("%c", c);
if (c == '!') {
return NULL;
}
}
}
int main()
{
pthread_t ptid, ctid;
sem_init(&full, 0, 0);
sem_init(&empty, 0, BUFFER_SIZE);
sem_init(&mutex, 0, 1);
pthread_create(&ptid, NULL, producer, NULL);
pthread_create(&ctid, NULL, consumer, NULL);
pthread_join(ptid, NULL);
pthread_join(ctid, NULL);
sem_destroy(&full);
sem_destroy(&empty);
sem_destroy(&mutex);
return 0;
}
```
在这个程序中,我们定义了三个信号量:`full`、`empty`和`mutex`。
`full`信号量用于表示缓冲区中可用的数据项数量;`empty`信号量用于表示缓冲区中的空闲数据项数量;`mutex`信号量用于实现对缓冲区的互斥访问。
在`producer`线程中,我们从标准输入中获取用户输入的字符串,并逐个字符将它们存入缓冲区中。每次存入一个字符后,我们都会检查该字符是否为`!`,如果是,则退出线程。
在`consumer`线程中,我们从缓冲区中逐个字符取出并打印它们。每次取出一个字符后,我们都会检查该字符是否为`!`,如果是,则退出线程。
在主函数中,我们初始化信号量,并创建生产者和消费者线程。然后等待这两个线程退出后,再销毁信号量。
希望我的回答能够对你有所帮助!
阅读全文