stack_interprocess_test.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. // Copyright (C) 2011 Tim Blechmann
  2. //
  3. // Distributed under the Boost Software License, Version 1.0. (See
  4. // accompanying file LICENSE_1_0.txt or copy at
  5. // http://www.boost.org/LICENSE_1_0.txt)
  6. #include <cstdlib> //std::system
  7. #include <sstream>
  8. #include <boost/interprocess/managed_shared_memory.hpp>
  9. #include <boost/lockfree/stack.hpp>
  10. #include <boost/thread/thread.hpp>
  11. using namespace boost::interprocess;
  12. typedef allocator<int, managed_shared_memory::segment_manager> ShmemAllocator;
  13. typedef boost::lockfree::stack<int,
  14. boost::lockfree::allocator<ShmemAllocator>,
  15. boost::lockfree::capacity<2048>
  16. > stack;
  17. int main (int argc, char *argv[])
  18. {
  19. if(argc == 1){
  20. struct shm_remove
  21. {
  22. shm_remove() { shared_memory_object::remove("MySharedMemory"); }
  23. ~shm_remove(){ shared_memory_object::remove("MySharedMemory"); }
  24. } remover;
  25. managed_shared_memory segment(create_only, "MySharedMemory", 65536);
  26. ShmemAllocator alloc_inst (segment.get_segment_manager());
  27. stack * queue = segment.construct<stack>("stack")(alloc_inst);
  28. for (int i = 0; i != 1024; ++i)
  29. queue->push(i);
  30. std::string s(argv[0]); s += " child ";
  31. if(0 != std::system(s.c_str()))
  32. return 1;
  33. while (!queue->empty())
  34. boost::thread::yield();
  35. return 0;
  36. } else {
  37. managed_shared_memory segment(open_only, "MySharedMemory");
  38. stack * queue = segment.find<stack>("stack").first;
  39. int from_queue;
  40. for (int i = 0; i != 1024; ++i) {
  41. bool success = queue->pop(from_queue);
  42. assert (success);
  43. assert (from_queue == 1023 - i);
  44. }
  45. segment.destroy<stack>("stack");
  46. }
  47. return 0;
  48. }