1 | #include <thread>
|
---|
2 | #include <chrono>
|
---|
3 | #include <iostream>
|
---|
4 |
|
---|
5 | #include <boost/interprocess/sync/scoped_lock.hpp>
|
---|
6 | #include <boost/interprocess/sync/named_mutex.hpp>
|
---|
7 | #include <boost/interprocess/sync/named_sharable_mutex.hpp>
|
---|
8 | #include <boost/interprocess/sync/sharable_lock.hpp>
|
---|
9 | #include <boost/interprocess/sync/named_condition_any.hpp>
|
---|
10 | #include <boost/interprocess/managed_shared_memory.hpp>
|
---|
11 |
|
---|
12 | namespace bi = boost::interprocess;
|
---|
13 | using SharedMutex = bi::named_sharable_mutex;
|
---|
14 | using ReadLock = bi::sharable_lock<SharedMutex>;
|
---|
15 | using WriteLock = bi::scoped_lock<SharedMutex>;
|
---|
16 | using NewEntryCondition = bi::named_condition_any;
|
---|
17 |
|
---|
18 | constexpr char SHM_NAME[] = "shared_mem";
|
---|
19 | constexpr char MUT_NAME[] = "shm_mut";
|
---|
20 | constexpr char COND_NAME[] = "shm_cond";
|
---|
21 | constexpr char CUR_INT_NAME[] = "shm_int";
|
---|
22 |
|
---|
23 |
|
---|
24 | int main(int argc, char *argv[])
|
---|
25 | {
|
---|
26 | // Remove the shared mem, condition variable, mutex
|
---|
27 | struct shm_remove
|
---|
28 | {
|
---|
29 | shm_remove() { bi::shared_memory_object::remove( SHM_NAME ); }
|
---|
30 | ~shm_remove() { bi::shared_memory_object::remove( SHM_NAME ); }
|
---|
31 | } remover;
|
---|
32 | struct mut_remove
|
---|
33 | {
|
---|
34 | mut_remove() { SharedMutex::remove(MUT_NAME); }
|
---|
35 | ~mut_remove() { SharedMutex::remove(MUT_NAME); }
|
---|
36 | } mut_remover;
|
---|
37 |
|
---|
38 | struct cond_remove
|
---|
39 | {
|
---|
40 | cond_remove() { NewEntryCondition::remove(COND_NAME); }
|
---|
41 | ~cond_remove() { NewEntryCondition::remove(COND_NAME); }
|
---|
42 | } cond_remover;
|
---|
43 |
|
---|
44 | // Create the shared mem, condition variable, mutex
|
---|
45 | bi::managed_shared_memory segment(bi::create_only, SHM_NAME, 2*65536);
|
---|
46 | SharedMutex sh_mut(bi::create_only, MUT_NAME);
|
---|
47 | NewEntryCondition sh_cond(bi::create_only, COND_NAME);
|
---|
48 |
|
---|
49 | int& shared_int = *segment.construct<int>("shared_int")(0);
|
---|
50 |
|
---|
51 | for (int i=0;;i++) {
|
---|
52 | std::this_thread::sleep_for(std::chrono::seconds(2));
|
---|
53 |
|
---|
54 | {
|
---|
55 | WriteLock w_lock( sh_mut );
|
---|
56 |
|
---|
57 | shared_int = i;
|
---|
58 | std::cout << "set shared_int to: " << shared_int << std::endl;
|
---|
59 |
|
---|
60 | sh_cond.notify_all();
|
---|
61 | }
|
---|
62 |
|
---|
63 | }
|
---|
64 |
|
---|
65 |
|
---|
66 |
|
---|
67 | return 0;
|
---|
68 | }
|
---|