30 volatile unsigned long read_mask;
31 omp_lock_t write_lock;
33 RWlock(): read_mask(0) {omp_init_lock(&write_lock);}
34 ~RWlock() {omp_destroy_lock(&write_lock);}
36 void lock_for_read() {
37 omp_set_lock(&write_lock);
39 read_mask |= (1 << omp_get_thread_num());
40 omp_unset_lock(&write_lock);
43 void unlock_for_read() {
45 read_mask &= ~(1 << omp_get_thread_num());
48 void lock_for_write() {
49 unsigned long read_set = read_mask & (1 << omp_get_thread_num());
51 omp_set_lock(&write_lock);
55 read_mask |= read_set;
58 void unlock_for_write() {
59 omp_unset_lock(&write_lock);
70 read_lock(RWlock& lock): lock(lock) {lock.lock_for_read();}
71 ~read_lock() {lock.unlock_for_read();}
79 write_lock(RWlock& lock): lock(lock) {lock.lock_for_write();}
80 ~write_lock() {lock.unlock_for_write();}
94 write_lock(
RWlock& lock) {}
Definition: omp_rw_lock.h:87
Definition: omp_rw_lock.h:86
_OPENMP
Definition: accessor.h:16