c语言实现线程邮箱
时间: 2023-08-17 16:21:15 浏览: 202
c语言实现的发送邮件
4星 · 用户满意度95%
线程邮箱是一种线程间通信的机制,它允许一个线程向另一个线程发送消息。在C语言中,可以使用信号量和队列来实现线程邮箱。
下面是一个使用信号量实现线程邮箱的示例代码:
```c
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#define MAX_MESSAGES 100
#define MAX_MESSAGE_LENGTH 50
char messages[MAX_MESSAGES][MAX_MESSAGE_LENGTH];
int message_count = 0;
int message_index = 0;
sem_t message_mutex;
sem_t message_count_sem;
sem_t message_space_sem;
void add_message(char *message) {
sem_wait(&message_space_sem);
sem_wait(&message_mutex);
snprintf(messages[message_index], MAX_MESSAGE_LENGTH, "%s", message);
message_index = (message_index + 1) % MAX_MESSAGES;
message_count++;
sem_post(&message_mutex);
sem_post(&message_count_sem);
}
void *producer(void *arg) {
char buffer[MAX_MESSAGE_LENGTH];
while (1) {
printf("Enter a message: ");
fgets(buffer, MAX_MESSAGE_LENGTH, stdin);
add_message(buffer);
}
}
void remove_message(char *message) {
sem_wait(&message_count_sem);
sem_wait(&message_mutex);
snprintf(message, MAX_MESSAGE_LENGTH, "%s", messages[message_index]);
message_index = (message_index + 1) % MAX_MESSAGES;
message_count--;
sem_post(&message_mutex);
sem_post(&message_space_sem);
}
void *consumer(void *arg) {
char buffer[MAX_MESSAGE_LENGTH];
while (1) {
remove_message(buffer);
printf("Received message: %s", buffer);
}
}
int main() {
pthread_t producer_thread, consumer_thread;
sem_init(&message_mutex, 0, 1);
sem_init(&message_count_sem, 0, 0);
sem_init(&message_space_sem, 0, MAX_MESSAGES);
pthread_create(&producer_thread, NULL, producer, NULL);
pthread_create(&consumer_thread, NULL, consumer, NULL);
pthread_join(producer_thread, NULL);
pthread_join(consumer_thread, NULL);
sem_destroy(&message_mutex);
sem_destroy(&message_count_sem);
sem_destroy(&message_space_sem);
return 0;
}
```
在这个示例中,我们使用了三个信号量来实现线程邮箱:
- `message_mutex` 用于保护消息队列的互斥访问。
- `message_count_sem` 用于表示消息队列中当前的消息数量。
- `message_space_sem` 用于表示消息队列中还有多少空间可以添加新的消息。
`add_message` 函数将消息添加到消息队列中,首先获取 `message_space_sem` 和 `message_mutex` 的锁,然后将消息添加到队列中,更新消息数量并释放锁。
`remove_message` 函数从消息队列中移除消息,首先获取 `message_count_sem` 和 `message_mutex` 的锁,然后从队列中获取消息,更新消息数量并释放锁。
`producer` 函数用于向消息队列中添加消息,它从标准输入中读取消息并调用 `add_message` 函数添加到队列中。
`consumer` 函数用于从消息队列中获取消息,它调用 `remove_message` 函数从队列中移除消息并打印出来。
在 `main` 函数中,我们初始化了三个信号量并创建了一个生产者线程和一个消费者线程。然后等待这两个线程退出并销毁信号量。
阅读全文