18 static struct test_array
*test_rcu_pointer
;
24 void *thr_reader(void *arg
)
27 struct test_array
*local_ptr
;
29 printf("thread %s, thread id : %lu, pid %lu\n",
30 "reader", pthread_self(), getpid());
33 urcu_register_thread();
35 for (i
= 0; i
< 1000; i
++) {
36 qparity
= rcu_read_lock();
37 local_ptr
= rcu_dereference(test_rcu_pointer
);
39 assert(local_ptr
->a
== 8);
40 assert(local_ptr
->b
== 12);
41 assert(local_ptr
->c
[55] == 2);
43 rcu_read_unlock(qparity
);
46 urcu_unregister_thread();
52 void *thr_writer(void *arg
)
55 struct test_array
*new, *old
;
57 printf("thread %s, thread id : %lu, pid %lu\n",
58 "writer", pthread_self(), getpid());
61 for (i
= 0; i
< 1000; i
++) {
63 new = malloc(sizeof(struct test_array
));
64 old
= test_rcu_pointer
;
68 assert(old
->c
[55] == 2);
72 assert(new->c
[55] = 2);
73 old
= urcu_publish_content(&test_rcu_pointer
, new);
75 /* can be done after unlock */
85 pthread_t tid_reader
[NR_READ
], tid_writer
[NR_WRITE
];
89 for (i
= 0; i
< NR_READ
; i
++) {
90 err
= pthread_create(&tid_reader
[i
], NULL
, thr_reader
, NULL
);
94 for (i
= 0; i
< NR_WRITE
; i
++) {
95 err
= pthread_create(&tid_writer
[i
], NULL
, thr_writer
, NULL
);
102 for (i
= 0; i
< NR_WRITE
; i
++) {
103 err
= pthread_join(tid_reader
[i
], &tret
);
107 for (i
= 0; i
< NR_WRITE
; i
++) {
108 err
= pthread_join(tid_writer
[i
], &tret
);
This page took 0.032288 seconds and 5 git commands to generate.