mirror of
https://github.com/boostorg/lockfree.git
synced 2026-01-19 16:32:09 +00:00
62 lines
1.9 KiB
C++
62 lines
1.9 KiB
C++
// 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 <cstdlib> //std::system
|
|
#include <thread>
|
|
|
|
#include <boost/interprocess/managed_shared_memory.hpp>
|
|
#include <boost/lockfree/stack.hpp>
|
|
|
|
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;
|
|
}
|