fork download
  1. #include<iostream>
  2. #define HAVE_STRUCT_TIMESPEC
  3. #include<pthread.h>
  4. #include<ctime>
  5. #include <chrono>
  6. using namespace std;
  7.  
  8. class BaseMutex // Version 3. Base class.
  9. {
  10. public:
  11. BaseMutex(pthread_mutex_t& lock) {};
  12. virtual ~BaseMutex() {};
  13. };
  14. class DerivedMutex: public BaseMutex // Version 3.
  15. {
  16. public:
  17. DerivedMutex(pthread_mutex_t& lock)
  18. : BaseMutex(lock), myLock(lock) {acquire();}
  19. ~DerivedMutex() {release();}
  20. private:
  21. int acquire() {return pthread_mutex_lock(&myLock);}
  22. int release() {return pthread_mutex_unlock(&myLock);}
  23. pthread_mutex_t& myLock;
  24. };
  25.  
  26. class SimpleMutex // Version two. Standalone lock class.
  27. {
  28. public:
  29. SimpleMutex(pthread_mutex_t& lock) : myLock(lock) {acquire();}
  30. ~SimpleMutex() {release();}
  31. private:
  32. int acquire() {return pthread_mutex_lock(&myLock);}
  33. int release() {return pthread_mutex_unlock(&myLock);}
  34. pthread_mutex_t& myLock;
  35. };
  36.  
  37. int main()// Version 1
  38. {
  39. pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
  40. int sharedCounter = 0;
  41. auto start = chrono::steady_clock::now();
  42. // Start timing here
  43. for (int i = 0; i < 1000000; i++) {
  44. DerivedMutex m(mutex);
  45. sharedCounter++;
  46. }
  47. // Stop timing heres
  48.  
  49. auto end = chrono::steady_clock::now();
  50. cout << "Time taken: " << chrono::duration_cast<chrono::milliseconds>(end - start).count() << endl;
  51.  
  52.  
  53. start = chrono::steady_clock::now();
  54. // Start timing here
  55. for (int i = 0; i < 1000000; i++) {
  56. SimpleMutex m(mutex);
  57. sharedCounter++;
  58. }
  59. // Stop timing heres
  60.  
  61. end = chrono::steady_clock::now();
  62. cout << "Time taken: " << chrono::duration_cast<chrono::milliseconds>(end - start).count() << endl;
  63.  
  64. start = chrono::steady_clock::now();
  65. // Start timing here
  66. for (int i = 0; i < 1000000; i++) {
  67. pthread_mutex_lock(&mutex);
  68. sharedCounter++;
  69. pthread_mutex_unlock(&mutex);
  70. }
  71. // Stop timing heres
  72.  
  73. end = chrono::steady_clock::now();
  74. cout << "Time taken: " << chrono::duration_cast<chrono::milliseconds>(end - start).count() << endl;
  75. }
Success #stdin #stdout 0.08s 5368KB
stdin
Standard input is empty
stdout
Time taken: 26
Time taken: 26
Time taken: 26