公共头文件doc_anonymous_condition_shared_data.h:
#include <boost/interprocess/sync/interprocess_mutex.hpp> #include <boost/interprocess/sync/interprocess_condition.hpp> struct trace_queue { enum { LineSize = 100 }; trace_queue() : message_in(false) { } // boost::interprocess::interprocess_mutex mutex; boost::interprocess::interprocess_condition cond_empty; boost::interprocess::interprocess_condition cond_full; // char items[LineSize]; bool message_in; };
写进程:
#include <iostream> #include <string> using namespace std; #include <boost/interprocess/shared_memory_object.hpp> #include <boost/interprocess/mapped_region.hpp> #include <boost/interprocess/sync/scoped_lock.hpp> #include "doc_anonymous_condition_shared_data.h" using namespace boost::interprocess; int main(int argc, char*argv[]) { struct shm_remove { shm_remove() { shared_memory_object::remove("MySharedMemory"); } ~shm_remove() { shared_memory_object::remove("MySharedMemory"); } }; shared_memory_object shm(create_only, "MySharedMemory", read_write); shm.truncate(sizeof(trace_queue)); mapped_region region(shm, read_write); void *addr = region.get_address(); trace_queue *data = new (addr) trace_queue; for(int i=0; i<100; i++) { scoped_lock<interprocess_mutex> lock(data->mutex); if(data->message_in) data->cond_full.wait(lock); if(99 == i) sprintf(data->items, "%s", "last message"); else sprintf(data->items, "%s_%d", "my_trace", i); cout<<data->items<<endl; data->cond_empty.notify_one(); data->message_in = true; } return 0; }
读进程:
#include <iostream> #include <string> using namespace std; #include <boost/interprocess/shared_memory_object.hpp> #include <boost/interprocess/mapped_region.hpp> #include <boost/interprocess/sync/scoped_lock.hpp> #include "doc_anonymous_condition_shared_data.h" using namespace boost::interprocess; void main(int argc, char *argv[]) { shared_memory_object shm(open_only, "MySharedMemory", read_write); mapped_region region(shm, read_write); void *addr = region.get_address(); trace_queue *data = static_cast<trace_queue*>(addr); bool end_loop = false; do { scoped_lock<interprocess_mutex> lock(data->mutex); if(!data->message_in) data->cond_empty.wait(lock); cout<<data->items<<endl; if(0 == strcmp(data->items, "last message")) { end_loop = true; } else { data->message_in = false; data->cond_full.notify_one(); } } while (!end_loop); shm.remove("MySharedMemory"); }