读者与写者同步问题
2013-01-08 11:31
459 查看
对于这个问题,简单的解决办法就是用我们前面提到的互斥锁,这样无论是读或写操作,都是排他性的,但有的时候这样会让多线程系统的并发性受到损害,例如,对于一个数据库,它是多线程共享的,那么有多个线程对其访问,如果是用互斥锁,当有多个线程要对其读取数据时,就要竞争互斥锁,只有一个线程获取,其他线程等待,直到这个线程读取完,才轮到下个线程,这是完全没有必要的,因为多个线程对其读取操作并不会让这些数据变得不安全,因为它们没有改变这个数据。所以对于这类情况,应该这样处理:
当没有线程对数据进行修改时,可以有多个线程对其读取;
当有一个(仅且只能有一个)线程对数据进行修改时,所有其他线程等待,包括要写的或要读的。
当有线程(可以多个)正在对数据读取时,如果有线程要修改该数据,必须等待,直到前面的所有线程访问完毕。
读与写的优先权可以不同。
多线程编程中,POSIX提供的读写锁,它实现了上面的功能。下面列出相关函数与数据结构:
读写锁数据结构:pthread_rwlock_t;
读写锁属性数据结构:pthread_rwlockattr_t;
(1)初始化函数:
intpthread_rwlock_init(pthread_rwlock_t *restrict rwlock, constpthread_rwlockattr_t * restrict attr);
按参数 attr指定的属性创建一个新的读写锁。如果参数attr 是NULL,则使用默认的属性创建读写锁。
(2)销毁函数:
intpthread_rwlock_destroy(pthread_rwlock_t *rwlock);
该函数用来释放对读写锁分配的资源,任何读写锁在销毁前,必须要确定没有线程正锁定着它。
(3)锁定与解锁函数:
intpthread_rwlock_rdlock(pthread_rwlock_t*rwlock);
该函数用来对读写锁进行读锁,在没有线程对其写锁的情况下,多个线程可以同时拥有读锁;如果有线程获取了写锁,那么调用线程将挂起,直到没有线程写锁。
intpthread_rwlock_tryrdlock(pthread_rwlock_t*rwlock);
该函数试图对读写锁进行读锁,但不堵塞。
intpthread_rwlock_wrlock(pthread_rwlock_t*rwlock);
该函数用来对读写锁进行写锁,写锁时排他性的,如果有线程已经获取了写锁或读锁,那么调用线程将挂起,直到没有线程写锁。
intpthread_rwlock_trywrlock(pthread_rwlock_t*rwlock);
该函数试图对读写锁进行写锁,但不堵塞。
intpthread_rwlock_unlock(pthread_rwlock_t*rwlock);
该函数用来解锁,无论是写锁还是读锁。
http://blog.sina.com.cn/s/blog_53a204a90100075o.html
当没有线程对数据进行修改时,可以有多个线程对其读取;
当有一个(仅且只能有一个)线程对数据进行修改时,所有其他线程等待,包括要写的或要读的。
当有线程(可以多个)正在对数据读取时,如果有线程要修改该数据,必须等待,直到前面的所有线程访问完毕。
读与写的优先权可以不同。
多线程编程中,POSIX提供的读写锁,它实现了上面的功能。下面列出相关函数与数据结构:
读写锁数据结构:pthread_rwlock_t;
读写锁属性数据结构:pthread_rwlockattr_t;
(1)初始化函数:
intpthread_rwlock_init(pthread_rwlock_t *restrict rwlock, constpthread_rwlockattr_t * restrict attr);
按参数 attr指定的属性创建一个新的读写锁。如果参数attr 是NULL,则使用默认的属性创建读写锁。
(2)销毁函数:
intpthread_rwlock_destroy(pthread_rwlock_t *rwlock);
该函数用来释放对读写锁分配的资源,任何读写锁在销毁前,必须要确定没有线程正锁定着它。
(3)锁定与解锁函数:
intpthread_rwlock_rdlock(pthread_rwlock_t*rwlock);
该函数用来对读写锁进行读锁,在没有线程对其写锁的情况下,多个线程可以同时拥有读锁;如果有线程获取了写锁,那么调用线程将挂起,直到没有线程写锁。
intpthread_rwlock_tryrdlock(pthread_rwlock_t*rwlock);
该函数试图对读写锁进行读锁,但不堵塞。
intpthread_rwlock_wrlock(pthread_rwlock_t*rwlock);
该函数用来对读写锁进行写锁,写锁时排他性的,如果有线程已经获取了写锁或读锁,那么调用线程将挂起,直到没有线程写锁。
intpthread_rwlock_trywrlock(pthread_rwlock_t*rwlock);
该函数试图对读写锁进行写锁,但不堵塞。
intpthread_rwlock_unlock(pthread_rwlock_t*rwlock);
该函数用来解锁,无论是写锁还是读锁。
http://blog.sina.com.cn/s/blog_53a204a90100075o.html
相关文章推荐
- 操作系统同步互斥经典问题——读者写者问题
- 经典同步问题--读者和写者问题
- Linux 关于读者与写者同步互斥问题的解析
- 经典进程同步问题:读者-写者问题
- Unix下读者写者同步问题的模拟程序
- 经典同步问题(三)---读者写者问题
- 操作系统进程同步互斥经典问题之读者写者问题
- 进程、线程知识点总结和同步(消费者生产者,读者写者三类问题)、互斥、异步、并发、并行、死锁、活锁的总结
- 经典进程同步问题:读者-写者问题
- Java进程间的同步与互斥实例(实现读者写者问题)
- 经典进程同步问题(二)——读者、写者问题
- 操作系统进程同步三大问题:生产者消费者,哲学家进餐,读者写者问题
- 进程同步互斥——读者写者问题
- 进程同步的经典问题1——读者写者问题(写者优先与公平竞争)
- 基于信号量与P/V操作同步机制的读者/写者问题的设计与实现 (写者优先)
- 操作系统清华大学版笔记(十) 信号量、管程、条件互斥、经典同步问题(读者写者、哲学家问题)
- 基于信号量与P/V操作同步机制的读者/写者问题的设计与实现 (写者优先)
- 进程同步的经典问题1——读者写者问题(写者优先与公平竞争)
- [线程同步问题]读者写者同步问题
- 进程、线程知识点总结和同步(消费者生产者,读者写者三类问题)、互斥、异步、并发、并行、死锁、活锁的总结