用信号量编写发送消息的Pthreads程序
时间: 2024-06-10 10:10:11 浏览: 11
以下是使用信号量编写发送消息的Pthreads程序的示例代码:
```
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <semaphore.h>
#define MAX_MESSAGES 10
char* messages[MAX_MESSAGES];
int message_count = 0;
sem_t message_mutex;
sem_t message_slots;
void* send_message(void* arg) {
char* message = (char*)arg;
sem_wait(&message_slots);
sem_wait(&message_mutex);
messages[message_count++] = message;
printf("Sent message: %s\n", message);
sem_post(&message_mutex);
return NULL;
}
int main() {
sem_init(&message_mutex, 0, 1);
sem_init(&message_slots, 0, MAX_MESSAGES);
pthread_t threads[5];
int i;
for (i = 0; i < 5; i++) {
char* message = (char*)malloc(sizeof(char) * 20);
sprintf(message, "Message %d", i+1);
pthread_create(&threads[i], NULL, send_message, (void*)message);
}
for (i = 0; i < 5; i++) {
pthread_join(threads[i], NULL);
}
sem_destroy(&message_mutex);
sem_destroy(&message_slots);
return 0;
}
```
在此示例中,我们使用了两个信号量来控制消息发送。`message_mutex` 信号量用于控制对 `messages` 数组的访问,避免多个线程同时访问导致数据竞争。`message_slots` 信号量用于控制可用的消息槽的数量,当消息槽已满时,发送线程将等待直到有可用的槽。
在 `send_message` 函数中,我们首先等待 `message_slots` 信号量,以确保有可用的消息槽。然后我们等待 `message_mutex` 信号量,以确保对 `messages` 数组的互斥访问。一旦获得了这两个信号量,我们将消息添加到 `messages` 数组中,然后释放 `message_mutex` 信号量。
在主函数中,我们创建了 5 个线程来发送消息,并等待它们完成。每个线程都将一个消息作为参数传递给 `send_message` 函数。
最后,我们销毁了 `message_mutex` 和 `message_slots` 信号量。