123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- // Copyright (C) 2014 Vicente Botet
- //
- // 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 <boost/interprocess/shared_memory_object.hpp>
- #include <boost/interprocess/mapped_region.hpp>
- #include <boost/thread.hpp>
- using namespace boost::interprocess;
- struct item
- {
- int i;
- };
- struct queue
- {
- void put( const item& item )
- {
- boost::unique_lock<boost::mutex> lock(mutex);
- while ( item_in )
- cond_full.wait(lock);
- item_ = item;
- item_in = true;
- cond_empty.notify_one();
- }
- void print()
- {
- boost::unique_lock<boost::mutex> lock(mutex);
- while ( !item_in )
- cond_empty.wait(lock);
- item_in = false;
- std::cout << item_.i << std::endl;
- cond_full.notify_one();
- }
- private:
- //Mutex to protect access to the queue
- boost::mutex mutex;
- //Condition to wait when the queue is empty
- boost::condition_variable cond_empty;
- //Condition to wait when the queue is full
- boost::condition_variable cond_full;
- bool item_in;
- //Items to fill
- item item_;
- };
- void *addr;
- void printThread()
- {
- //Erase previous shared memory and schedule erasure on exit
- struct shm_remove
- {
- shm_remove() { shared_memory_object::remove("MySharedMemory"); }
- ~shm_remove(){ shared_memory_object::remove("MySharedMemory"); }
- } remover;
- //Create a shared memory object.
- shared_memory_object shm(create_only,"MySharedMemory",read_write);
- try
- {
- // //Set size
- // shm.truncate(sizeof(queue));
- //
- // //Map the whole shared memory in this process
- // mapped_region region(shm,read_write);
- //
- // //Get the address of the mapped region
- // void *addr = region.get_address();
- //Construct the shared structure in memory
- queue *q = new (addr) queue;
- do
- {
- q->print();
- } while ( true );
- }
- // catch(interprocess_exception &ex)
- // {
- // std::cout << ex.what() << std::endl;
- // }
- catch(boost::thread_interrupted&)
- {
- std::cout << "interrupted" << std::endl;
- }
- catch(...)
- {
- std::cout << "exception" << std::endl;
- }
- }
- int main()
- {
- addr = new queue();
- boost::thread t(printThread);
- // give the thread time to create the shm
- boost::this_thread::sleep( boost::posix_time::milliseconds( 1000 ) );
- // //Create a shared memory object.
- // shared_memory_object shm(open_only,"MySharedMemory",read_write);
- try
- {
- // //Map the whole shared memory in this process
- // mapped_region region(shm,read_write);
- //
- // //Get the address of the mapped region
- // void *addr = region.get_address();
- //Obtain a pointer to the shared structure
- queue *q = static_cast<queue*>(addr);
- item i;
- i.i = 42;
- q->put( i );
- ++i.i;
- q->put( i );
- // give the printThread time to "process" the item
- boost::this_thread::sleep( boost::posix_time::milliseconds( 1000 ) );
- t.interrupt();
- t.join();
- }
- catch(...)
- {
- std::cout << "exception" << std::endl;
- return -1;
- }
- }
|