用信号量编写发送消息的Pthreads程序
时间: 2024-06-11 11:04:32 浏览: 11
以下是使用信号量编写发送消息的Pthreads程序的示例:
```C
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#define MAX_MESSAGE_LEN 100 // 消息的最大长度
char message[MAX_MESSAGE_LEN]; // 全局变量,用于存储消息
sem_t sem_send; // 用于发送消息的信号量
sem_t sem_receive; // 用于接收消息的信号量
void *sender_thread(void *arg) {
while (1) {
sem_wait(&sem_send); // 等待发送信号量
printf("Enter a message to send:\n");
fgets(message, MAX_MESSAGE_LEN, stdin); // 读取用户输入的消息
sem_post(&sem_receive); // 发送接收信号量,通知接收者可以接收消息了
}
return NULL;
}
void *receiver_thread(void *arg) {
while (1) {
sem_wait(&sem_receive); // 等待接收信号量
printf("Received message: %s\n", message); // 输出接收到的消息
sem_post(&sem_send); // 发送发送信号量,通知发送者可以发送消息了
}
return NULL;
}
int main(int argc, char *argv[]) {
pthread_t sender, receiver;
sem_init(&sem_send, 0, 1); // 初始化发送信号量为1
sem_init(&sem_receive, 0, 0); // 初始化接收信号量为0
pthread_create(&sender, NULL, sender_thread, NULL); // 创建发送者线程
pthread_create(&receiver, NULL, receiver_thread, NULL); // 创建接收者线程
pthread_join(sender, NULL); // 等待发送者线程结束
pthread_join(receiver, NULL); // 等待接收者线程结束
sem_destroy(&sem_send); // 销毁发送信号量
sem_destroy(&sem_receive); // 销毁接收信号量
return 0;
}
```
在这个程序中,我们使用了两个信号量 `sem_send` 和 `sem_receive`,分别用于发送和接收消息。当发送者线程想要发送消息时,它会等待 `sem_send` 信号量;当接收者线程接收到了消息时,它会发送 `sem_send` 信号量,通知发送者线程可以发送下一条消息了。
注意,在发送和接收消息的过程中,我们都使用了 `sem_wait` 和 `sem_post` 函数来等待和发送信号量。这些函数都是原子操作,确保了多个线程之间的同步和互斥。
此外,我们使用了一个全局变量 `message` 来存储消息。请注意,由于多个线程可能同时访问该变量,因此我们必须确保对它的访问是同步和互斥的。在这个程序中,我们没有使用任何锁或其他同步机制来保护 `message` 变量,而是依赖于信号量来确保线程之间的同步和互斥。