Refactors misc test cases
[libcds.git] / benchmark-drivers / spinlock_driver.cpp
1 #include <atomic>
2 #include <cds/sync/spinlock.h>
3 #include <ctime>
4 #include <iostream>
5 #include <string>
6 #include <thread>
7
8 using namespace std;
9
10 int x;
11 atomic_int y;
12 cds::sync::spin_lock<cds::backoff::LockDefault> mutex;
13
14 void Thread() {
15   for (int i = 0; i < 100000; i++) {
16     for (int j = 0; j < 3000; j++) {
17       //  for (int i = 0; i < 300000; i++) {
18       //    for (int j = 0; j < 300000; j++) {
19       if (!mutex.is_locked()) {
20         mutex.lock();
21         x = 1;
22         y.load(memory_order_relaxed);
23         mutex.unlock();
24       }
25     }
26   }
27 }
28
29 int main() {
30   const int kThreads = 6;
31   cout << "Starting " << kThreads << " threads for Spinlock...\n";
32   
33   struct timespec start, finish;
34   double elapsed = 0.0;
35   clock_gettime(CLOCK_MONOTONIC, &start);
36
37   std::thread threads[kThreads];
38   for (int i = 0; i < kThreads; i++) {
39     threads[i] = std::thread(Thread);
40   }
41
42   for (int i = 0; i < kThreads; i++) {
43     threads[i].join();
44   }
45   clock_gettime(CLOCK_MONOTONIC, &finish);
46   elapsed = (finish.tv_sec - start.tv_sec);
47   elapsed += (finish.tv_nsec - start.tv_nsec) / 1000000000.0;
48   cout << "All threads finished.\n";
49   cout << "Time: " << elapsed << " seconds\n";
50
51   return 0;
52 }