sharedmutex3bobcat
Mutex for shared memory
Usage
#include <bobcat/sharedmutex>
Linking option: -lpthread, -lbobcat
Overview
Shared memory may be used by multiple processes. To synchronize access to shared memory an FBB::SharedMutex may be defined inside a shared memory segment. SharedMutex objects allows clients to lock a shared memory segment before reading or writing its content. E.g., the Bobcat class FBB::SharedSegment defines a SharedMutex in its shared memory segment.
The SharedMutex class uses the facilities offered by the PThread library to implement (non recursive) shared memory locking. To force unlocking a (possibly) locked shared memory segment, its destructor can be called.
SharedMutex mutexes are non-recursive, resulting in deadlocks if their lock member is called twice from the same thread of execution without an intermediate call to unlock the mutex. If this causes concern, a variable can be defined indicating whether the lock has already been obtained.
Namespace
FBB
All constructors, members, operators and manipulators, mentioned in this man-page, are defined in the namespace FBB.
Inherits from
-
Constructors, destructor
- o
-
SharedMutex():
The default constructor initializes anFBB::SharedMutexobject to a shared memory mutex (using the PTHREAD_PROCESS_SHARED attribute). As anFBB::SharedMutexobject will normally be defined inside a shared memory segment the object’s memory is already available. In this case placement new should be used to call the constructor. E.g., if a shared memory segment is attached to the current process at d_shared, and anFBB::SharedMutexshould be defined at d_shared’s address, then theFBB::SharedMutexobject can be initialized like this:new (d_shared) FBB::SharedMutex;
Caveat: when using placement new to initialize a
SharedMutexmake sure that theSharedMutexfits inside a block (i.e., shared.blockOffset() + sizeof(SharedMemory) < shared.dataSegmentSize()). If not, use seek to switch to an offset where this equality holds true, or simply use SharedMemory::create like this:FBB::SharedMemory::create<FBB::SharedMutex>();
- o
-
~SharedMutex():
The class’s destructor releases all of the current process’s nested shared memory segment locks. To destroy anFBB::SharedMutexobject that has been constructed using the placement new operator used_sharedMutex->~SharedMutex();
(assuming SharedMutex *d_sharedMutex points to the location where placement new has previously initialized the
FBB::SharedMutexobject.)
-
Copy and move constructors (and assignment operators) are not available.
Member functions
- o
-
void lock() const:
When returning from this member, the current process has locked the shared memory segment. Note thatSharedMutexobjects are non-recursive.
- o
-
void unlock() const:
The object’s lock of the shared memory segment is released. This member can also be called if theSharedMutex’slock has not been obtained.
Protected member function
- o
-
pthread_mutex_t *mutexPtr():
A pointer is returned to the pthread_mutex_t object used by theSharedMutexobject;
Examples
#include <sys/types.h>
#include <signal.h>
#include <iostream>
#include <string>
#include <chrono>
#include <bobcat/fork>
#include <bobcat/semaphore>
#include <bobcat/sharedsegment>
#include <bobcat/sharedmutex>
using namespace std;
using namespace FBB;
class Wait: public Fork
{
SharedSegment *d_shared;
int d_id;
SharedMutex *d_mutex;
public:
Wait();
~Wait();
void childProcess() override;
void parentProcess() override;
};
Wait::Wait()
:
d_shared(SharedSegment::create(&d_id, 1, 100, 0700)),
d_mutex(new (d_shared) SharedMutex)
{
cout << "shared memory ID = " << d_id << ’\n’;
}
Wait::~Wait()
{
d_mutex->~SharedMutex();
SharedSegment::deleteSegment(d_id);
cout << "deleted the shared memory\n";
}
void Wait::childProcess()
{
Semaphore waiter{0};
while (true)
{
waiter.wait_for(chrono::seconds(2));
d_mutex->lock();
cout << "child hello\n";
d_mutex->unlock();
}
}
void Wait::parentProcess()
{
string line;
do
{
cout << "press enter to allow the parent to locck\n";
cin.ignore(100, ’\n’);
d_mutex->lock();
cout << "parent has the lock, press enter to continue "
"(to end: some input)\n";
getline(cin, line);
d_mutex->unlock();
}
while (line.empty());
kill(pid(), SIGTERM);
}
int main()
{
Wait waiter;
waiter.fork();
}
Files
bobcat/sharedmutex - defines the class interface
Bobcat project files
- o
-
https://fbb-git.gitlab.io/bobcat/: gitlab project page;
Debian Bobcat project files:
- o
-
libbobcat6: debian package containing the shared library, changelog and copyright note;
- o
-
libbobcat-dev: debian package containing the static library, headers, manual pages, and developer info;
Bobcat
Bobcat is an acronym of `Brokken’s Own Base Classes And Templates’.
Releases
6 releases since Debian 8 (Jessie); the text changed 5 times.