(3)用信号量编写发送消息的Pthreads程序
时间: 2024-05-08 17:17:43 浏览: 15
以下是一个使用信号量的Pthreads程序,用于发送消息:
```c
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#define NUM_THREADS 2
// 定义一个全局变量,用于存储消息
char message[100];
// 定义两个信号量,一个用于保护消息,一个用于同步线程
sem_t mutex, sync;
// 线程函数,用于发送消息
void *send_message(void *threadid) {
long tid;
tid = (long) threadid;
// 等待同步信号量
sem_wait(&sync);
// 获取消息保护信号量
sem_wait(&mutex);
// 发送消息
sprintf(message, "Hello from thread %ld", tid);
printf("Thread %ld sent message: %s\n", tid, message);
// 释放消息保护信号量
sem_post(&mutex);
// 发送完成信号量
sem_post(&sync);
pthread_exit(NULL);
}
int main () {
pthread_t threads[NUM_THREADS];
int rc;
long t;
// 初始化信号量
sem_init(&mutex, 0, 1);
sem_init(&sync, 0, 0);
// 创建线程
for(t=0; t<NUM_THREADS; t++){
rc = pthread_create(&threads[t], NULL, send_message, (void *)t);
if (rc) {
printf("ERROR; return code from pthread_create() is %d\n", rc);
return -1;
}
}
// 发送同步信号量
sem_post(&sync);
// 等待线程完成
for(t=0; t<NUM_THREADS; t++) {
rc = pthread_join(threads[t], NULL);
if (rc) {
printf("ERROR; return code from pthread_join() is %d\n", rc);
return -1;
}
}
// 销毁信号量
sem_destroy(&mutex);
sem_destroy(&sync);
pthread_exit(NULL);
}
```
在这个程序中,有两个信号量:
- 保护信号量(mutex):用于保护消息,防止多个线程同时修改它。
- 同步信号量(sync):用于同步线程,保证它们在发送消息之前都能够准备好。
在主线程中,我们首先初始化了这两个信号量。然后,我们创建两个线程,并发送同步信号量,以确保它们都可以开始执行。在线程函数中,我们首先等待同步信号量,以确保所有线程都能够准备好。然后,我们获取消息保护信号量,发送消息,释放信号量,并发送完成信号量。
最后,我们等待所有线程完成,并销毁信号量。
这个程序可以用以下命令编译运行:
```bash
$ gcc -o send_message send_message.c -lpthread
$ ./send_message
```
输出应该类似于以下内容:
```bash
Thread 0 sent message: Hello from thread 0
Thread 1 sent message: Hello from thread 1
```