实现一个多线程安全的linux 消息队列
时间: 2023-12-27 16:03:52 浏览: 283
在 Linux 下实现一个多线程安全的消息队列可以使用 POSIX 消息队列。POSIX 消息队列是一种在进程间传递数据的机制,通过在进程间传递消息来实现进程间通信。它提供了在多个进程之间传递数据的标准接口,并且支持多线程。
下面是一个简单的例子,展示如何使用 POSIX 消息队列实现多线程安全的消息队列。
```c++
#include <fcntl.h>
#include <mqueue.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define QUEUE_NAME "/my_queue"
#define MAX_MESSAGES 10
#define MAX_MSG_SIZE 256
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
mqd_t mq_fd;
void *producer(void *arg) {
char buffer[MAX_MSG_SIZE];
int count = 0;
while (1) {
snprintf(buffer, MAX_MSG_SIZE, "Message %d", count++);
pthread_mutex_lock(&mutex);
mq_send(mq_fd, buffer, strlen(buffer) + 1, 0);
pthread_mutex_unlock(&mutex);
sleep(1);
}
}
void *consumer(void *arg) {
char buffer[MAX_MSG_SIZE];
unsigned int prio;
while (1) {
pthread_mutex_lock(&mutex);
ssize_t bytes_read = mq_receive(mq_fd, buffer, MAX_MSG_SIZE, &prio);
pthread_mutex_unlock(&mutex);
if (bytes_read >= 0) {
printf("Received message: %s\n", buffer);
} else {
perror("mq_receive");
}
}
}
int main(int argc, char **argv) {
struct mq_attr attr;
attr.mq_flags = 0;
attr.mq_maxmsg = MAX_MESSAGES;
attr.mq_msgsize = MAX_MSG_SIZE;
attr.mq_curmsgs = 0;
mq_fd = mq_open(QUEUE_NAME, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, &attr);
if (mq_fd == -1) {
perror("mq_open");
exit(1);
}
pthread_t producer_thread, consumer_thread;
pthread_create(&producer_thread, NULL, producer, NULL);
pthread_create(&consumer_thread, NULL, consumer, NULL);
pthread_join(producer_thread, NULL);
pthread_join(consumer_thread, NULL);
mq_close(mq_fd);
mq_unlink(QUEUE_NAME);
return 0;
}
```
在这个例子中,我们创建了一个 POSIX 消息队列,并且创建了两个线程来分别作为生产者和消费者。生产者线程不断地向队列发送消息,而消费者线程则从队列中接收消息。由于消息队列是多线程安全的,我们使用互斥锁来保护队列的访问。
阅读全文