C语言pthread 读写锁 自旋锁 效率比较 代码

写了个代码用于比较 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();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值