我正在尝试在共享内存中设置队列,以便进程P1,P2等可以将消息推送到同一队列,这些队列将由另一个进程C1使用。
我使用了boost :: interprocess :: managed_shared_memory + boost :: lockfree :: queue(在编译时固定大小)并且它工作正常。不需要特殊的分配器。
当我转向boost :: interprocess :: managed_shared_memory + tbb :: concurrent_bounded_queue(我喜欢那里的阻塞推送和弹出机制)时,我无法编译代码。
namespace bip = boost::interprocess;
typedef bip::allocator<DataType, bip::managed_shared_memory::segment_manager> ShmAlloc;
typedef tbb::concurrent_bounded_queue<DataType, ShmAlloc> BufferQueue;
// declare memory
bip::managed_shared_memory segment(bip::create_only, "MySharedMemory", 65536);
// initialize allocator
const ShmAlloc alloc_inst(segment.get_segment_manager());
// construct the queue in shared memory
BufferQueue *queue = segment.construct<BufferQueue>("data_queue")(alloc_inst);
在Mac OS中使用clang ++ 6.0,提升1.56,tbb 4.3,编译时出现以下错误:
In file included from tbbproducer.cpp:5:
/opt/homebrew/include/tbb/concurrent_queue.h:263:13: error: reinterpret_cast from 'pointer' (aka 'offset_ptr<char, long, unsigned long, 0UL>')
to 'void *' is not allowed
void *b = reinterpret_cast<void*>(my_allocator.allocate( n ));
问题1: 我怎么能修好这个?可以在内存中使用tbb :: concurrent_queue吗?
问题2: 如果(1)是不可能的,是否有其他队列支持阻塞push和pop我可以在共享内存中使用?
谢谢!
答案 0 :(得分:1)
无论编译问题背后的原因如何,tbb::concurrent_queue
还没有准备好与tbb::concurrent_bounded_queue
,tbb::concurrent_vector
和tbb::concurrent_hash_map
一起在进程间共享内存中工作,因为这些容器使用用户提供的分配器实例(至少TBB 4.3)分配不是所有内存。
有两种容器可能按预期工作,因为它们通过用户提供的分配器实例分配所有内存:tbb::concurrent_priority_queue
和tbb::concurrent_unordered_*
容器系列。您可能想尝试使用第一个而不是tbb::concurrent_queue
。