linux 3个线程间消息通信例子
时间: 2023-05-25 07:03:48 浏览: 86
以下是一个基本的 Linux 3 个线程间消息通信例子,包括创建线程、发送消息和接收消息。其中,线程间的通信使用信号量和共享内存实现:
```
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <semaphore.h>
#include <fcntl.h>
#include <sys/mman.h>
#define SHARED_MEM_SIZE 128
#define SHARED_FILENAME "/shared_mem"
#define SEM_FILENAME "/semaphore"
typedef struct {
int flag; // 消息标识
char data[64]; // 消息内容
} Message;
Message* shared_mem; // 共享内存
sem_t* semaphore; // 信号量
void* thread1(void* arg) { // 发送线程
int i;
for (i = 0; i < 5; i++) {
sem_wait(semaphore); // 等待信号量
shared_mem->flag = 1; // 设置标识为 1
sprintf(shared_mem->data, "Thread 1 message %d", i);
printf("Thread 1 sent message: %s\n", shared_mem->data);
sem_post(semaphore); // 发送信号量
sleep(1);
}
pthread_exit(NULL); // 退出线程
}
void* thread2(void* arg) { // 接收线程
int i;
for (i = 0; i < 5; i++) {
sem_wait(semaphore); // 等待信号量
if (shared_mem->flag == 1) { // 收到标识为 1 的消息
printf("Thread 2 received message: %s\n", shared_mem->data);
shared_mem->flag = 0; // 清除标识
}
sem_post(semaphore); // 发送信号量
sleep(1);
}
pthread_exit(NULL); // 退出线程
}
int main() {
int shm_fd;
pthread_t tid1, tid2;
// 创建共享内存
shm_fd = shm_open(SHARED_FILENAME, O_CREAT | O_RDWR, 0666);
ftruncate(shm_fd, SHARED_MEM_SIZE);
shared_mem = (Message*) mmap(NULL, SHARED_MEM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
// 创建信号量
semaphore = sem_open(SEM_FILENAME, O_CREAT, 0666, 1);
// 创建线程
pthread_create(&tid1, NULL, thread1, NULL);
pthread_create(&tid2, NULL, thread2, NULL);
// 等待线程结束
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
// 关闭并删除共享内存和信号量
munmap(shared_mem, SHARED_MEM_SIZE);
close(shm_fd);
shm_unlink(SHARED_FILENAME);
sem_close(semaphore);
sem_unlink(SEM_FILENAME);
return 0;
}
```
上述代码中,首先创建了一个消息结构体 `Message`,它包含一个消息标识 `flag` 和一个消息内容 `data`。
然后使用 `mmap()` 函数创建共享内存和 `sem_open()` 函数创建信号量。其中,`sem_post()` 和 `sem_wait()` 函数用于发送和接收信号量,在发送和接收消息前必须获取信号量。
创建线程使用 `pthread_create()` 函数,分别创建发送和接收线程,并使用 `pthread_join()` 函数等待线程结束,最后释放共享内存和信号量。在发送线程中,设置标识为 1,表示发送消息,在共享内存中存储消息内容。在接收线程中,等待标识为 1 的消息,然后读取共享内存中的消息内容,并清除标识。发送和接收线程都设置了睡眠时间,以便更好地模拟消息的发送和接收。
相关推荐
![gz](https://img-home.csdnimg.cn/images/20210720083447.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)