C++17实现的读写锁

1.shared_mutex和shared_lock很有意思的两个关于共享线程锁的特性
#include
#include<shared_mutex>
#include
#include
#include
using namespace std;
class Counter
{
public:
std::size_t Get() const
{
std::shared_lockstd::shared_mutex lock(mtx);
return value_;
}
void Increase()
{
std::unique_lockstd::shared_mutex lock(mtx);
value_++;
}
void Reset()
{
std::unique_lockstd::shared_mutex lock(mtx);
value_=0;
}
private:
mutable std::shared_mutex mtx;
std::size_t value_ = 0;
};
std::mutex g_mtx;
void worker(Counter &counter)
{
for (int i = 0; i < 3; i++)
{
counter.Increase();
std::size_t value = counter.Get();
std::lock_guardstd::mutex lock(g_mtx);
cout << std::this_thread::get_id() << " " << value << endl;
}
}
int main()
{
const std::size_t size = 2;
Counter counter;
vectorstd::thread v;
v.reserve(size);
v.emplace_back(worker, std::ref(counter));
v.emplace_back(worker, std::ref(counter));
for (std::thread &t : v)
{
t.join();
}
system(“pause”);
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C11标准中提供了读写锁(read-write lock)的机制,可以在多线程环境下实现对共享资源的读写控制。读写锁可以分为读锁和写锁,读锁可以被多个线程同时持有,但是写锁只能被一个线程独占。读写锁的基本操作包括: 1. 初始化:pthread_rwlock_init() 2. 加读锁:pthread_rwlock_rdlock() 3. 加写锁:pthread_rwlock_wrlock() 4. 解锁:pthread_rwlock_unlock() 5. 销毁:pthread_rwlock_destroy() 下面是一个简单的使用读写锁的例子: ```c #include <stdio.h> #include <stdlib.h> #include <pthread.h> pthread_rwlock_t rwlock; int shared_data = 0; void *reader(void *arg) { pthread_rwlock_rdlock(&rwlock); printf("Reader %ld: shared_data = %d\n", (long)arg, shared_data); pthread_rwlock_unlock(&rwlock); return NULL; } void *writer(void *arg) { pthread_rwlock_wrlock(&rwlock); shared_data++; printf("Writer %ld: shared_data = %d\n", (long)arg, shared_data); pthread_rwlock_unlock(&rwlock); return NULL; } int main() { pthread_t threads[6]; pthread_rwlock_init(&rwlock, NULL); for (long i = 0; i < 2; i++) { pthread_create(&threads[i], NULL, writer, (void *)i); } for (long i = 2; i < 6; i++) { pthread_create(&threads[i], NULL, reader, (void *)i); } for (int i = 0; i < 6; i++) { pthread_join(threads[i], NULL); } pthread_rwlock_destroy(&rwlock); return 0; } ``` 在这个例子中,共有两个写线程和四个读线程。写线程负责增加共享数据的值,读线程负责读取共享数据的值。在写线程加写锁的时候,读线程会被阻塞;在读线程加读锁的时候,其他读线程可以同时持有读锁,但是写线程会被阻塞。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值