我有一个资源(矢量,列表,等等),我试图访问多个作家/读者。
我不确定如何实现最佳性能,即如果数据结构被锁定,读取器的锁定量最小。使用两个锁是否更好,一个叫做readmutex,另一个叫做writemutex?
例如:
struct Foo {
mutex writemutex_;
mutex readmutex_;
vector<string> data_;
void write(string data)
{
lock_guard<mutex> locker(writemutex_);
data_.emplace_back(move(data));
}
string get(int index) const {
// I don't need to lock for read, but what if the data is being written?
// and so should I lock lockmutex_? If so, then readmutex_ is unnecessary?
// is there some cleaver way that I can avoid readers from being blocked?
return data_[index];
}
};
我可以在这里使用其他同步技术吗?
答案 0 :(得分:2)
您需要Readers–writer lock。但你应该考虑到在某些场景中,rw锁可能比独占锁更慢
答案 1 :(得分:1)
您可以使用boost中提供的shared_mutex
,并成为C++14的一部分。
struct Foo
{
using mutex = boost::shared_mutex;
using write_lock = boost::unique_lock<mutex>;
using read_lock = boost::shared_lock<mutex>;
mutable mutex mutex_;
vector<string> data_;
void write(string data)
{
write_lock lock{ mutex_ };
data_.emplace_back(move(data));
}
string get(int index) const
{
read_lock lock{ mutex_ };
return data_[index];
}
};
答案 2 :(得分:0)
回答你的主要问题:不,使用两把锁并不是更好。这实际上是不正确的。你需要写锁来防止比赛,并且在持有写锁时不需要任何额外的读锁。
其他答案确实有正确的替代方法(shared_mutex,它实现了读写锁定),但没有解释为什么需要它。