写了个代码用于比较 pthread 读写锁和自旋锁的效率。
结论:
读写锁的读锁效率低于自旋锁。写锁效率远远低于自旋锁。
读写锁在大量读操作(远大于写),且每次读时间开销很大的时候,效率很高。
如果不存在这种场景,自旋锁的效率是极高的。
#include "con_vector.h"
#include <stdio.h>
#include <sys/time.h>
#include <stdio.h>
#include <unistd.h>
#define THREAD_CNT 10
#define TASK_SIZE 100
#define TASK_ROUND 1000000
pthread_spinlock_t spinlock;
pthread_rwlock_t rwlock;
pthread_t threads[THREAD_CNT];
void* task(void* x) {
for(int i = 0; i < TASK_ROUND; i ++) {
pthread_rwlock_wrlock(&rwlock);
for(int j = 0; j < TASK_SIZE; j ++);
pthread_rwlock_unlock(&rwlock);
}
}
void* task2(void* x) {
for(int i = 0; i < TASK_ROUND; i ++) {
pthread_spin_lock(&spinlock);
for(int j = 0; j < TASK_SIZE; j ++);
pthread_spin_unlock(&spinlock);
}
}
void test_rwlock() {
pthread_rwlock_init(&rwlock, NULL);
struct timeval tv;
gettimeofday(&tv, NULL);
long long s1 = tv.tv_sec * 1000 + tv.tv_usec / 1000;
for(int i = 0; i < THREAD_CNT; i ++) {
pthread_create(&threads[i], NULL, task, NULL);
}
for(int i = 0; i < THREAD_CNT; i ++) {
pthread_join(threads[i], NULL);
}
gettimeofday(&tv, NULL);
long long s2 = tv.tv_sec * 1000 + tv.tv_usec / 1000;
printf("rwlock= %lld\n", s2 - s1);
}
void test_spinlock() {
pthread_spin_init(&spinlock, PTHREAD_PROCESS_PRIVATE);
struct timeval tv;
gettimeofday(&tv, NULL);
long long s1 = tv.tv_sec * 1000 + tv.tv_usec / 1000;
for(int i = 0; i < THREAD_CNT; i ++) {
pthread_create(&threads[i], NULL, task2, NULL);
}
for(int i = 0; i < THREAD_CNT; i ++) {
pthread_join(threads[i], NULL);
}
gettimeofday(&tv, NULL);
long long s2 = tv.tv_sec * 1000 + tv.tv_usec / 1000;
printf("spinlock= %lld\n", s2 - s1);
}
int main()
{
test_spinlock();
test_rwlock();
}