Linux消息队列实战:C语言简洁示例与线程同步

需积分: 39 2 下载量 192 浏览量 更新于2024-09-11 收藏 5KB TXT 举报
在Linux操作系统中,消息队列是一种进程间通信(IPC,Inter-Process Communication)机制,用于在不同进程之间传递数据。本文档主要介绍了如何通过C语言使用Linux的消息队列来实现两个线程之间的通信。消息队列允许线程之间异步通信,无需共享内存,适合处理大量或复杂的数据传输。 首先,我们需要了解几个关键概念: 1. 消息队列:它是一个具有特定大小的区域,用于存储消息。每个消息队列都有一个唯一的标识符,进程可以通过这个标识符进行操作,如发送和接收消息。 2. 线程:在这里,有两个线程,sender1和sender2,分别负责向receiver线程发送消息。receiver线程负责接收这些消息并作出响应。 3. 信号量:信号量被用来实现线程之间的同步和互斥,确保在多线程环境中避免数据竞争和资源冲突。 以下是一个简化的代码示例,展示了如何创建消息队列、发送和接收消息: ```c #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <sys/mqueue.h> #define QUEUE_NAME "my_queue" #define MSG_SIZE 1024 void *sender1(void *arg) { int i; char message[MSG_SIZE]; struct msqid_ds mqstat; // 创建消息队列 if (mq_open(QUEUE_NAME, O_CREAT | O_RDWR, 0644, &mqstat) != 0) { perror("mq_open failed"); exit(EXIT_FAILURE); } while (1) { printf("Sender 1: Enter message (or 'exit' to quit): "); fgets(message, sizeof(message), stdin); if (strcmp(message, "exit") == 0) break; mq_send(mqstat.mqdes, message, strlen(message) + 1, 0); // 发送消息 // 仅示例,实际项目中可以省略对响应的等待 // mq_get(mqstat.mqdes, &msg, sizeof(msg)); // 接收应答并处理 } mq_send(mqstat.mqdes, "end1", 4, 0); // 发送结束信号 mq_close(mqstat.mqdes); pthread_exit(NULL); } void *sender2(void *arg) { // 类似于sender1,只需共享同一消息队列 // ... } void *receiver(void *arg) { char msg[MSG_SIZE], response[MSG_SIZE]; struct msqid_ds mqstat; if (mq_open(QUEUE_NAME, O_RDONLY, 0, &mqstat) != 0) { perror("mq_open failed"); exit(EXIT_FAILURE); } while (1) { mq_get(mqstat.mqdes, msg, sizeof(msg)); // 接收消息 printf("Receiver: Received message: %s\n", msg); if (strcmp(msg, "end1") == 0) { mq_send(mqstat.mqdes, "over1", 5, 0); // 发送给sender1的应答 } else if (strcmp(msg, "end2") == 0) { mq_send(mqstat.mqdes, "over2", 5, 0); // 发送给sender2的应答 } // 删除消息队列,结束后关闭 mq_unlink(QUEUE_NAME); mq_close(mqstat.mqdes); break; } pthread_exit(NULL); } int main() { pthread_t sender1_thread, sender2_thread, receiver_thread; pthread_create(&sender1_thread, NULL, sender1, NULL); pthread_create(&sender2_thread, NULL, sender2, NULL); pthread_create(&receiver_thread, NULL, receiver, NULL); pthread_join(sender1_thread, NULL); pthread_join(sender2_thread, NULL); pthread_join(receiver_thread, NULL); return 0; } ``` 在这个示例中,`sender1` 和 `sender2` 线程使用`mq_send`函数向`receiver`线程发送消息,而`receiver`线程通过`mq_get`函数接收消息。在接收特定消息(如"end1"和"end2")时,receiver会发送相应的应答消息。信号量在这里并未明确实现,但可以根据实际需求使用`semaphore`或其他同步机制来确保线程安全。 总结来说,本篇文档提供了使用Linux消息队列在C语言中实现多线程间异步通信的一个基础示例,包括创建、使用和销毁消息队列的过程。通过这个例子,开发者可以理解如何在Linux环境下构建高效、可靠的线程通信架构。