【发布时间】:2017-02-14 09:17:27
【问题描述】:
我正在尝试构建一个具有多个进程的应用程序。这些进程需要通过同一个消息队列并发写入。另一方面,只有一个进程读取该队列。
这可以使用 boost 吗?还是我必须实现互斥?
我查看了示例源代码,但它无法满足我的需要。我不知道我是否遗漏了什么。
这是客户端上的代码:
#include <boost/interprocess/ipc/message_queue.hpp>
#include <iostream>
#include <vector>
#include <unistd.h>
using namespace boost::interprocess;
int main ()
{
try{
//Erase previous message queue
//message_queue::remove("message_queue");
//Create a message_queue.
message_queue mq
(open_or_create //only create
,"message_queue" //name
,100 //max message number
,sizeof(int) //max message size
);
//Send 100 numbers
for(int i = 0; i < 100; ++i){
printf("Sending: %d\n", i);
usleep(1000000);
mq.send(&i, sizeof(i), 0);
}
}
catch(interprocess_exception &ex){
std::cout << ex.what() << std::endl;
return 1;
}
return 0;
}
和服务器代码:
#include <boost/interprocess/ipc/message_queue.hpp>
#include <iostream>
#include <vector>
using namespace std;
using namespace boost::interprocess;
int main ()
{
try{
//message_queue::remove("message_queue");
//Open a message queue.
message_queue mq
(open_only //only create
,"message_queue" //name
);
unsigned int priority;
message_queue::size_type recvd_size;
//Receive 100 numbers
for(int i = 0; i < 100; ++i){
int number;
mq.receive(&number, sizeof(number), recvd_size, priority);
if(number != i || recvd_size != sizeof(number))
return 1;
cout << number << endl;
}
}
catch(interprocess_exception &ex){
message_queue::remove("message_queue");
std::cout << ex.what() << std::endl;
return 1;
}
//message_queue::remove("message_queue");
return 0;
}
提前致谢。
【问题讨论】:
-
如果只有线程共享这个队列,为什么要使用任何进程间的东西?
-
你不能只使用
boost::lockfree::queue吗? -
@GManNickG 在另一边,将有 1 个线程(另一个进程)读取 N 个线程已发布到队列的内容。我的意思是,消息通过队列的顺序无关紧要,但是 N 个线程需要通过该队列进行写入。还有其他方法吗?
-
@NathanOliver 我真的不知道如何使用那个锁:/。
-
@Pric:请不要混合线程和进程。线程包含在一个进程中,但并不相同。听起来你有另一个进程从这个进程的队列中读取,并且想要一个支持这个的多生产者单消费者队列。这些进程中的每一个都涉及线程这一事实相对无关紧要。这是一个正确的总结吗?
标签: c++ multithreading boost queue message-queue