#ifndef THREAD_UTIL_H
#define THREAD_UTIL_H
#include <pthread.h>
namespace spider {
class AutoLock {
pthread_mutex_t * _lock;
public:
AutoLock(pthread_mutex_t * lock) {
_lock = lock;
pthread_mutex_lock(_lock);
}
~AutoLock() {
pthread_mutex_unlock(_lock);
}
};
class RWLock {
pthread_rwlock_t _lock;
public:
RWLock() {
pthread_rwlock_init(&_lock, NULL);
}
int read() {
return pthread_rwlock_rdlock(&_lock);
}
int write() {
return pthread_rwlock_wrlock(&_lock);
}
int unlock() {
return pthread_rwlock_unlock(&_lock);
}
};
class AutoRead {
RWLock * _lock;
public:
AutoRead(RWLock * p) {
_lock = p;
_lock->read();
}
~AutoRead() {
_lock->unlock();
}
};
class AutoWrite {
RWLock * _lock;
public:
AutoWrite(RWLock * p) {
_lock = p;
_lock->write();
}
~AutoWrite() {
_lock->unlock();
}
};
}
#endif // THREAD_UTIL_H
/* vim: set ts=4 sw=4 sts=4 tw=100 */
c++多線程之讀寫鎖
pthread是POSIX threads的簡稱,是POSIX的線程標准
pthread讀寫鎖把對共享資源的訪問分為讀者和寫者,讀者只對共享資源進行讀訪問,寫者只對共享資源進行寫操作。
在互斥機制,讀者和寫者都需要獨立獨占互斥量以獨占共享資源,
在讀寫鎖機制下,允許同時有多個讀者訪問共享資源,只有寫者才需要獨占資源。
相比互斥機制,讀寫機制由於允許多個讀者同時訪問共享資源,進一步提高了多線程的並發度。
1. 讀寫鎖機制
寫者:寫者使用寫鎖,如果當前沒有讀者,也沒有其他寫者,寫者立即獲得寫鎖;
否則寫者將等待,直到沒有讀者和寫者。
讀者:讀者使用讀鎖,如果當前沒有寫者,讀者立即獲得讀鎖;否則讀者等待,直到沒有寫者。
2. 讀寫鎖特性:
同一時刻只有一個線程可以獲得寫鎖,同一時刻可以有多個線程獲得寫鎖。
讀寫鎖出於寫鎖狀態時,所有試圖對讀寫鎖加鎖的線程,不管是讀者試圖
加讀鎖,還是寫者試圖加寫鎖,都會被阻塞。
讀寫鎖處於讀鎖狀態時,有寫者試圖加寫鎖時,之后的其他線程的讀鎖請求
會被阻塞,以避免寫者長時間的不寫鎖。
3. 讀寫鎖基本函數:
#include <pthread.h>
--------------
讀寫鎖初始化
int pthread_rwlock_init(pthread_rwlock_t * rwlock, const pthread_rwlockattr_t * attr);
該函數第一個參數為讀寫鎖指針,第二個參數為讀寫鎖屬性指針。函數按讀寫鎖屬性對讀寫鎖進行
初始化。
--------------
http://www.th7.cn/Program/cp/201405/195894.shtml