#include<iostream>
#define HAVE_STRUCT_TIMESPEC
#include<pthread.h>
#include<ctime>
#include <chrono>
using namespace std;
class BaseMutex // Version 3. Base class.
{
public:
BaseMutex(pthread_mutex_t& lock) {};
virtual ~BaseMutex() {};
};
class DerivedMutex: public BaseMutex // Version 3.
{
public:
DerivedMutex(pthread_mutex_t& lock)
: BaseMutex(lock), myLock(lock) {acquire();}
~DerivedMutex() {release();}
private:
int acquire() {return pthread_mutex_lock(&myLock);}
int release() {return pthread_mutex_unlock(&myLock);}
pthread_mutex_t& myLock;
};
class SimpleMutex // Version two. Standalone lock class.
{
public:
SimpleMutex(pthread_mutex_t& lock) : myLock(lock) {acquire();}
~SimpleMutex() {release();}
private:
int acquire() {return pthread_mutex_lock(&myLock);}
int release() {return pthread_mutex_unlock(&myLock);}
pthread_mutex_t& myLock;
};
int main()// Version 1
{
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int sharedCounter = 0;
auto start = chrono::steady_clock::now();
// Start timing here
for (int i = 0; i < 1000000; i++) {
DerivedMutex m(mutex);
sharedCounter++;
}
// Stop timing heres
auto end = chrono::steady_clock::now();
cout << "Time taken: " << chrono::duration_cast<chrono::milliseconds>(end - start).count() << endl;
start = chrono::steady_clock::now();
// Start timing here
for (int i = 0; i < 1000000; i++) {
SimpleMutex m(mutex);
sharedCounter++;
}
// Stop timing heres
end = chrono::steady_clock::now();
cout << "Time taken: " << chrono::duration_cast<chrono::milliseconds>(end - start).count() << endl;
start = chrono::steady_clock::now();
// Start timing here
for (int i = 0; i < 1000000; i++) {
pthread_mutex_lock(&mutex);
sharedCounter++;
pthread_mutex_unlock(&mutex);
}
// Stop timing heres
end = chrono::steady_clock::now();
cout << "Time taken: " << chrono::duration_cast<chrono::milliseconds>(end - start).count() << endl;
}