【C++11多线程与并发编程】 (5) 读写锁

【C++11多线程与并发编程】 (5) 读写锁

读写锁

读写锁(Read-Write Lock)

  • 共享锁和独占锁:读写锁有两种锁模式:读锁(共享锁)和写锁(独占锁)。多个读线程可以同时持有读锁,但写线程必须独占持有写锁。
  • 适用于:读操作远多于写操作的场景,能提高系统的并发性能。
  • 开销:在读多写少的情况下,能减少锁争用,提高效率。

使用shared_lock(C++14)和shared_mutex(C++17)实现读写锁

#include <iostream>
#include <vector>
#include <thread>
#include <shared_mutex>

std::vector<int> data;
std::shared_mutex rw_mtx;

void addData(int value) {
    std::unique_lock<std::shared_mutex> lock(rw_mtx); // 独占锁
    data.push_back(value);
}

void printData() {
    std::shared_lock<std::shared_mutex> lock(rw_mtx); // 共享锁
    for (int value : data) {
        std::cout << value << " ";
    }
    std::cout << std::endl;
}

int main() {
    std::thread t1(addData, 1);
    std::thread t2(addData, 2);
    std::thread t3(printData);

    t1.join();
    t2.join();
    t3.join();

    return 0;
}

使用<pthread>实现读写锁

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;

void *reader(void *arg) {
    pthread_rwlock_rdlock(&rwlock); // 获取读锁
    printf("Thread %ld: Reading...\n", (long)arg);
    pthread_rwlock_unlock(&rwlock); // 释放读锁
    return NULL;
}

void *writer(void *arg) {
    pthread_rwlock_wrlock(&rwlock); // 获取写锁
    printf("Thread %ld: Writing...\n", (long)arg);
    pthread_rwlock_unlock(&rwlock); // 释放写锁
    return NULL;
}

int main() {
    pthread_t threads[4];

    pthread_create(&threads[0], NULL, reader, (void *)1);
    pthread_create(&threads[1], NULL, reader, (void *)2);
    pthread_create(&threads[2], NULL, writer, (void *)3);
    pthread_create(&threads[3], NULL, reader, (void *)4);

    for (int i = 0; i < 4; i++) {
        pthread_join(threads[i], NULL);
    }

    pthread_rwlock_destroy(&rwlock);
    return 0;
}

n(threads[i], NULL);
    }

    pthread_rwlock_destroy(&rwlock);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值