linux 线程使用消息队列例子
时间: 2024-10-25 20:15:58 浏览: 21
在Linux系统中,线程间通过消息队列通信是一种常见的并发控制机制,它允许一个线程将数据放入队列,而另一个线程则可以从队列中取出并处理数据。下面是一个简单的示例,演示了如何使用`msg_queue`库在两个线程之间传递消息:
首先,创建一个消息队列:
```bash
#include <sys/msg.h>
#include <stdlib.h>
int create_msg_queue() {
key_t key = ftok("/tmp/myqueue", 'M'); // 使用特定路径和字符作为键
struct msg_queue *mq = msgget(key, IPC_CREAT | 0644);
if (mq == -1) {
perror("msgget failed");
return -1;
}
return mq;
}
```
然后,定义发送者线程(sender_thread.c):
```c
void sender_thread(int mqdes) {
int msg_num = 5; // 消息数量
for (int i = 0; i < msg_num; ++i) {
char message[] = "Message from sender, number: " + i;
ssize_t bytes_sent = msgsnd(mqdes, message, strlen(message), 0);
if (bytes_sent == -1) {
perror("msgsnd failed");
}
}
}
```
接着,定义接收者线程(receiver_thread.c):
```c
void receiver_thread(int mqdes) {
char buffer[1024];
while (1) {
ssize_t bytes_received = msgrcv(mqdes, buffer, sizeof(buffer), 0, 0); // 阻塞接收直到有消息可用
if (bytes_received > 0) {
printf("Received message: %s\n", buffer);
} else if (bytes_received == -1 && errno == EAGAIN) { // 如果没有消息,检查是否是因为阻塞
sleep(1); // 等待1秒再试
} else {
perror("msgrcv failed");
break;
}
}
}
```
最后,在主程序中启动线程:
```c
int main() {
int mqdes = create_msg_queue();
if (mqdes == -1) {
return -1;
}
pthread_t sender_pid, receiver_pid;
if (pthread_create(&sender_pid, NULL, &sender_thread, (void*)mqdes)) {
perror("pthread_create for sender failed");
return -1;
}
if (pthread_create(&receiver_pid, NULL, &receiver_thread, (void*)mqdes)) {
perror("pthread_create for receiver failed");
return -1;
}
pthread_join(sender_pid, NULL);
pthread_join(receiver_pid, NULL);
msgctl(mqdes, MSQRM semiclassical, NULL); // 删除消息队列
close(mqdes);
return 0;
}
```
运行这个程序,你会看到发送者线程向接收者线程发送消息,而接收者线程在接收到消息后打印出来。
阅读全文