// Copyright (C) 2011 Tim Blechmann // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include //std::system #include #include #include using namespace boost::interprocess; typedef allocator< int, managed_shared_memory::segment_manager > ShmemAllocator; typedef boost::lockfree::stack< int, boost::lockfree::allocator< ShmemAllocator >, boost::lockfree::capacity< 2048 > > stack; int main( int argc, char* argv[] ) { if ( argc == 1 ) { struct shm_remove { shm_remove() { shared_memory_object::remove( "MySharedMemory" ); } ~shm_remove() { shared_memory_object::remove( "MySharedMemory" ); } } remover; managed_shared_memory segment( create_only, "MySharedMemory", 65536 ); ShmemAllocator alloc_inst( segment.get_segment_manager() ); stack* queue = segment.construct< stack >( "stack" )( alloc_inst ); for ( int i = 0; i != 1024; ++i ) queue->push( i ); std::string s( argv[ 0 ] ); s += " child "; if ( 0 != std::system( s.c_str() ) ) return 1; while ( !queue->empty() ) std::this_thread::yield(); return 0; } else { managed_shared_memory segment( open_only, "MySharedMemory" ); stack* queue = segment.find< stack >( "stack" ).first; int from_queue; for ( int i = 0; i != 1024; ++i ) { bool success = queue->pop( from_queue ); (void)success; assert( success ); assert( from_queue == 1023 - i ); } segment.destroy< stack >( "stack" ); } return 0; }