读写者问题是一类比较特殊的问题。可以允许多个读者同时读,但不允许多个写者或者写者和读者同时操作。所以需要保证读者和写者之间的同步与互斥关系,以及多个写者之间的互斥关系。

读写锁是一种自旋锁:自旋锁是当一个线程没有申请资源成功,不会等待,而是一直在进行循环判断是否锁被释放。

  1 #include
  2 #include
  3   4 pthread_rwlock_t rwlock;  5   6 int buf;  7 void *reader(void *arg)  8 {  9     while(1) 10     { 11         pthread_rwlock_rdlock(&rwlock); 12         printf("reader%d is reading...:%d\n",(int)arg,buf); 13         pthread_rwlock_unlock(&rwlock); 14         sleep(1); 15  16     } 17 } 18 void *writer(void *arg) 19 { 20     int i = 0; 21     while(1) 22     { 23         pthread_rwlock_wrlock(&rwlock); 24         buf = i++; 25         printf("writer:%d\n",buf); 26         pthread_rwlock_unlock(&rwlock); 27         sleep(1); 28     } 29 } 30  31 int main() 32 { 33     pthread_t tid1,tid2,tid3,tid4; 34     pthread_create(&tid1,NULL,reader,(void*)1); 35     pthread_create(&tid3,NULL,reader,(void*)2); 36     pthread_create(&tid2,NULL,writer,NULL); 37  38     pthread_rwlock_init(&rwlock,NULL); 39     pthread_join(tid1,NULL); 40     pthread_join(tid3,NULL); 41     pthread_join(tid2,NULL); 42     pthread_rwlock_destroy(&rwlock); 43     return 0; 44 }  运行结果 [fbl@localhost rw_lock]$ ./rwlock writer:0reader2 is reading...:0reader1 is reading...:0writer:1reader2 is reading...:1reader1 is reading...:1writer:2reader2 is reading...:2reader1 is reading...:2writer:3reader2 is reading...:3reader1 is reading...:3writer:4reader2 is reading...:4reader1 is reading...:4writer:5reader2 is reading...:5reader1 is reading...:5writer:6reader2 is reading...:6reader1 is reading...:6