comp_doc_anonymous_upgradable_mutexA.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // (C) Copyright Ion Gaztanaga 2006-2012. Distributed under the Boost
  4. // Software License, Version 1.0. (See accompanying file
  5. // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. //
  7. // See http://www.boost.org/libs/interprocess for documentation.
  8. //
  9. //////////////////////////////////////////////////////////////////////////////
  10. #include <boost/interprocess/detail/config_begin.hpp>
  11. //[doc_anonymous_upgradable_mutexA
  12. #include <boost/interprocess/shared_memory_object.hpp>
  13. #include <boost/interprocess/mapped_region.hpp>
  14. #include <boost/interprocess/sync/scoped_lock.hpp>
  15. #include "doc_upgradable_mutex_shared_data.hpp"
  16. #include <iostream>
  17. #include <cstdio>
  18. using namespace boost::interprocess;
  19. int main ()
  20. {
  21. //Remove shared memory on destruction
  22. struct shm_remove
  23. {
  24. ~shm_remove(){ shared_memory_object::remove("MySharedMemory"); }
  25. } remover;
  26. //<-
  27. (void)remover;
  28. //->
  29. //Create a shared memory object.
  30. shared_memory_object shm
  31. (create_only //only create
  32. ,"MySharedMemory" //name
  33. ,read_write //read-write mode
  34. );
  35. //Set size
  36. shm.truncate(sizeof(shared_data));
  37. //Map the whole shared memory in this process
  38. mapped_region region
  39. (shm //What to map
  40. ,read_write //Map it as read-write
  41. );
  42. //Get the address of the mapped region
  43. void * addr = region.get_address();
  44. //Construct the shared structure in memory
  45. shared_data * data = new (addr) shared_data;
  46. //Write some logs
  47. for(int i = 0; i < shared_data::NumItems; ++i){
  48. //Lock the upgradable_mutex
  49. scoped_lock<interprocess_upgradable_mutex> lock(data->upgradable_mutex);
  50. std::sprintf(data->items[(data->current_line++) % shared_data::NumItems]
  51. ,"%s_%d", "process_a", i);
  52. if(i == (shared_data::NumItems-1))
  53. data->end_a = true;
  54. //Mutex is released here
  55. }
  56. //Wait until the other process ends
  57. while(1){
  58. scoped_lock<interprocess_upgradable_mutex> lock(data->upgradable_mutex);
  59. if(data->end_b)
  60. break;
  61. }
  62. return 0;
  63. }
  64. //]
  65. #include <boost/interprocess/detail/config_end.hpp>