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