(一)當(dāng)前被讀鎖占著
1。如果讀優(yōu)先(默認(rèn)是PTHREAD_RWLOCK_PREFER_READER_NP,即讀優(yōu)先),那么等著的讀請(qǐng)求可以快速拿到鎖,寫(xiě)一直被餓著(直到?jīng)]有任何等待獲取讀鎖的情況下,寫(xiě)才能拿到寫(xiě)鎖);
2。如果寫(xiě)優(yōu)先,那么讀和寫(xiě)都等著,一但前面的讀釋放了鎖,寫(xiě)立刻就會(huì)優(yōu)先讀來(lái)拿到鎖;
(二)當(dāng)前被寫(xiě)鎖占著
不論誰(shuí)優(yōu)先,都需要把所有等著的寫(xiě)都服務(wù)完,才會(huì)給讀機(jī)會(huì),所以寫(xiě)多讀少的情況下,就應(yīng)該用互斥鎖了;
測(cè)試程序:
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <stdint.h>
#include <pthread.h>
#include <vector>
#include <map>
#include <set>
using namespace std;
long g_idx = 0;
class ThreadRwLock {
private:
pthread_rwlock_t m_rw_mutex;
public:
ThreadRwLock() {
pthread_rwlockattr_t attr;
// 設(shè)置寫(xiě)優(yōu)先
pthread_rwlockattr_init(&attr);
//pthread_rwlockattr_setkind_np(&attr, PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP);
pthread_rwlock_init(&m_rw_mutex, &attr);
}
~ThreadRwLock() {
pthread_rwlock_destroy(&m_rw_mutex);
}
void rdlock() {
pthread_rwlock_rdlock(&m_rw_mutex);
}
void wrlock() {
pthread_rwlock_wrlock(&m_rw_mutex);
}
int tryrdlock() {
return pthread_rwlock_tryrdlock(&m_rw_mutex);
}
int trywrlock() {
return pthread_rwlock_trywrlock(&m_rw_mutex);
}
void unlock() {
pthread_rwlock_unlock(&m_rw_mutex);
}
};
ThreadRwLock g_lock;
void* thread_routine(void* arg) {
long is_write = (long)arg;
if (is_write) {
printf("%lu wait write lock\n", pthread_self()); fflush(stdout);
g_lock.wrlock();
long idx = __sync_add_and_fetch(&g_idx, 1);
printf("%lu get write lock, %ld\n", pthread_self(), idx); fflush(stdout);
sleep(5);
g_lock.unlock();
} else {
printf("%lu wait read lock\n", pthread_self()); fflush(stdout);
g_lock.rdlock();
long idx = __sync_add_and_fetch(&g_idx, 1);
printf("%lu get read lock, %ld\n", pthread_self(), idx); fflush(stdout);
sleep(5);
g_lock.unlock();
}
return NULL;
}
int main(int argc, char* argv[]) {
pthread_t tid = 0;
pthread_create(&tid, NULL, thread_routine, (void*)0);
pthread_create(&tid, NULL, thread_routine, (void*)0);
pthread_create(&tid, NULL, thread_routine, (void*)0);
pthread_create(&tid, NULL, thread_routine, (void*)0);
pthread_create(&tid, NULL, thread_routine, (void*)0);
pthread_create(&tid, NULL, thread_routine, (void*)1);
getchar(); //讓程序暫停,等待鍵盤(pán)敲入一個(gè)字節(jié)后,接著走
pthread_create(&tid, NULL, thread_routine, (void*)1);
sleep(2); //確保寫(xiě)鎖被優(yōu)先拿到
pthread_create(&tid, NULL, thread_routine, (void*)0);
pthread_create(&tid, NULL, thread_routine, (void*)0);
pthread_create(&tid, NULL, thread_routine, (void*)1);
pthread_create(&tid, NULL, thread_routine, (void*)1);
pthread_create(&tid, NULL, thread_routine, (void*)1);
pthread_create(&tid, NULL, thread_routine, (void*)1);
pthread_create(&tid, NULL, thread_routine, (void*)1);
pthread_create(&tid, NULL, thread_routine, (void*)0);
pthread_create(&tid, NULL, thread_routine, (void*)0);
pthread_create(&tid, NULL, thread_routine, (void*)1);
pthread_create(&tid, NULL, thread_routine, (void*)1);
pthread_create(&tid, NULL, thread_routine, (void*)1);
pthread_create(&tid, NULL, thread_routine, (void*)1);
pthread_create(&tid, NULL, thread_routine, (void*)1);
pthread_create(&tid, NULL, thread_routine, (void*)1);
pthread_create(&tid, NULL, thread_routine, (void*)1);
pthread_create(&tid, NULL, thread_routine, (void*)1);
pthread_create(&tid, NULL, thread_routine, (void*)1);
pthread_create(&tid, NULL, thread_routine, (void*)1);
pthread_create(&tid, NULL, thread_routine, (void*)0);
pthread_create(&tid, NULL, thread_routine, (void*)0);
getchar();
return 0;
}