• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /** Hold several types of synchronization objects locked as long as specified.
2  */
3 
4 #define _GNU_SOURCE 1
5 
6 #include <assert.h>
7 #include <pthread.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <time.h>
11 #include <unistd.h>
12 
13 
delay_ms(const int ms)14 static void delay_ms(const int ms)
15 {
16   struct timespec ts;
17 
18   assert(ms >= 0);
19   ts.tv_sec = ms / 1000;
20   ts.tv_nsec = (ms % 1000) * 1000 * 1000;
21   nanosleep(&ts, 0);
22 }
23 
main(int argc,char ** argv)24 int main(int argc, char** argv)
25 {
26   int interval = 0;
27   int optchar;
28   pthread_mutex_t     mutex;
29   pthread_mutexattr_t mutexattr;
30   pthread_rwlock_t    rwlock;
31 
32   while ((optchar = getopt(argc, argv, "i:")) != EOF)
33   {
34     switch (optchar)
35     {
36     case 'i':
37       interval = atoi(optarg);
38       break;
39     default:
40       fprintf(stderr, "Usage: %s [-i <interval time in ms>].\n", argv[0]);
41       break;
42     }
43   }
44 
45   fprintf(stderr, "Locking mutex ...\n");
46 
47   pthread_mutexattr_init(&mutexattr);
48   pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_RECURSIVE);
49   pthread_mutex_init(&mutex, &mutexattr);
50   pthread_mutexattr_destroy(&mutexattr);
51   pthread_mutex_lock(&mutex);
52   delay_ms(interval);
53   pthread_mutex_lock(&mutex);
54   pthread_mutex_unlock(&mutex);
55   pthread_mutex_unlock(&mutex);
56   pthread_mutex_destroy(&mutex);
57 
58   fprintf(stderr, "Locking rwlock exclusively ...\n");
59 
60   pthread_rwlock_init(&rwlock, 0);
61   pthread_rwlock_wrlock(&rwlock);
62   delay_ms(interval);
63   pthread_rwlock_unlock(&rwlock);
64   pthread_rwlock_destroy(&rwlock);
65 
66   fprintf(stderr, "Locking rwlock shared ...\n");
67 
68   pthread_rwlock_init(&rwlock, 0);
69   pthread_rwlock_rdlock(&rwlock);
70   delay_ms(interval);
71   pthread_rwlock_rdlock(&rwlock);
72   pthread_rwlock_unlock(&rwlock);
73   pthread_rwlock_unlock(&rwlock);
74   pthread_rwlock_destroy(&rwlock);
75 
76   fprintf(stderr, "Done.\n");
77 
78   return 0;
79 }
80