/* * rwlock6.c * * Check writer and reader locking * * Depends on API functions: * pthread_rwlock_rdlock() * pthread_rwlock_wrlock() * pthread_rwlock_unlock() */ #include "test.h" static pthread_rwlock_t rwlock1 = PTHREAD_RWLOCK_INITIALIZER; static int bankAccount = 0; void * wrfunc(void * arg) { int ba; assert(pthread_rwlock_wrlock(&rwlock1) == 0); Sleep(2000); bankAccount += 10; ba = bankAccount; assert(pthread_rwlock_unlock(&rwlock1) == 0); return ((void *) ba); } void * rdfunc(void * arg) { int ba; assert(pthread_rwlock_rdlock(&rwlock1) == 0); ba = bankAccount; assert(pthread_rwlock_unlock(&rwlock1) == 0); return ((void *) ba); } int main() { pthread_t wrt1; pthread_t wrt2; pthread_t rdt; int wr1Result = 0; int wr2Result = 0; int rdResult = 0; bankAccount = 0; assert(pthread_create(&wrt1, NULL, wrfunc, NULL) == 0); Sleep(500); assert(pthread_create(&rdt, NULL, rdfunc, NULL) == 0); Sleep(500); assert(pthread_create(&wrt2, NULL, wrfunc, NULL) == 0); assert(pthread_join(wrt1, (void **) &wr1Result) == 0); assert(pthread_join(rdt, (void **) &rdResult) == 0); assert(pthread_join(wrt2, (void **) &wr2Result) == 0); assert(wr1Result == 10); assert(rdResult == 20); assert(wr2Result == 20); return 0; }