【发布时间】:2017-05-02 19:06:53
【问题描述】:
boost::shared_mutex 或 std::shared_mutex (C++17) 可用于单写多读访问。作为一个教育练习,我整理了一个简单的实现,它使用自旋锁并具有其他限制(例如公平策略),但显然不打算在实际应用中使用。
这个想法是,如果没有线程持有锁,互斥锁的引用计数为零。如果 > 0,则该值表示有权访问的阅读器数量。如果为 -1,则单个作者可以访问。
这是一个没有数据竞争的正确实现(特别是使用的、最小的、内存排序)吗?
#include <atomic>
class my_shared_mutex {
std::atomic<int> refcount{0};
public:
void lock() // write lock
{
int val;
do {
val = 0; // Can only take a write lock when refcount == 0
} while (!refcount.compare_exchange_weak(val, -1, std::memory_order_acquire));
// can memory_order_relaxed be used if only a single thread takes write locks ?
}
void unlock() // write unlock
{
refcount.store(0, std::memory_order_release);
}
void lock_shared() // read lock
{
int val;
do {
do {
val = refcount.load(std::memory_order_relaxed);
} while (val == -1); // spinning until the write lock is released
} while (!refcount.compare_exchange_weak(val, val+1, std::memory_order_acquire));
}
void unlock_shared() // read unlock
{
// This must be a release operation (see answer)
refcount.fetch_sub(1, std::memory_order_relaxed);
}
};
【问题讨论】:
标签: c++ multithreading c++11 mutex stdatomic