linux c语言 多线程 消息队列
时间: 2025-06-29 10:05:41 浏览: 16
### 实现多线程消息队列
在Linux环境中使用C语言实现多线程消息队列涉及到多个方面,包括创建和操作消息队列、管理线程以及同步机制。下面将详细介绍如何利用`pthread`库来实现在不同线程之间共享的消息队列。
#### 定义消息结构体
为了便于在线程间传递信息,首先需要定义一个合适的消息结构体:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/msg.h>
#include <unistd.h>
#include <pthread.h>
#define MAX_MSG_SIZE 256
// 消息结构体
struct message {
long mtype; // 类型字段
char mtext[MAX_MSG_SIZE]; // 数据部分
};
```
此段代码展示了消息的基本构成[^4]。
#### 初始化全局变量并声明必要的函数原型
接着设置一些全局资源供各个线程访问,并声明后续要用到的功能接口:
```c
int msgid;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void* producer(void*);
void* consumer(void*);
key_t key = ftok("/tmp", 'A'); // 使用ftok生成唯一键值用于标识消息队列
```
这里采用了`ftok()`方法获取唯一的键值作为参数调用`msgget()`创建新的或连接已存在的消息队列实例[^2]。
#### 主程序逻辑
编写主线程负责启动生产者与消费者子线程的工作流程:
```c
int main(){
pthread_t tid_producer, tid_consumer;
// 创建消息队列
if ((msgid=msgget(key, IPC_CREAT | 0666))<0){
perror("msgget");
exit(EXIT_FAILURE);
}
// 启动两个线程分别模拟生产和消费行为
pthread_create(&tid_producer,NULL,&producer,(void*)NULL);
pthread_create(&tid_consumer,NULL,&consumer,(void*)NULL);
// 等待所有子线程结束再继续执行下去
pthread_join(tid_producer,NULL);
pthread_join(tid_consumer,NULL);
// 清理工作:销毁消息队列
if (msgctl(msgid,IPC_RMID,NULL)<0){
perror("msgctl(IPC_RMID)");
exit(EXIT_FAILURE);
}
printf("All threads finished.\n");
return EXIT_SUCCESS;
}
```
上述片段实现了主控端点的任务分配过程,在完成之后记得清理不再使用的系统资源[^3]。
#### 生产者线程功能实现
生产者负责向队列发送新消息:
```c
void* producer(void *arg){
struct message msg;
while(1){
sleep(rand()%3); // 随机延时模仿实际场景下的不规律输入
strcpy(msg.mtext,"Hello from Producer!");
msg.mtype=1L;
pthread_mutex_lock(&mutex);
msgsnd(msgid,&msg,sizeof(struct message)-sizeof(long),0);
pthread_mutex_unlock(&mutex);
printf("Message sent by Producer: %s\n",msg.mtext);
break; // 此处仅做简单测试故只循环一次即退出
}
return NULL;
}
```
这段源码描述了一个简单的生产者角色,它会周期性地制造数据并通过互斥锁保护的方式将其写入公共存储区中去。
#### 消费者线程功能实现
相对应地,消费者则持续监听是否有可用的新条目到来以便及时读取出来处理:
```c
void* consumer(void *arg){
struct message msg;
while(1){
msgrcv(msgid,&msg,sizeof(struct message)-sizeof(long),1L,0);
printf("Message received by Consumer: %s\n",msg.mtext);
break; // 测试目的所以也只接收一条就停止运行
}
return NULL;
}
```
以上就是整个基于POSIX标准的跨线程通讯方案的具体编码实践。
阅读全文
相关推荐


















