c ++两个锁比一个好吗?

时间:2014-01-07 08:00:15

标签: c++ multithreading thread-safety mutex

我有一个资源(矢量,列表,等等),我试图访问多个作家/读者。

我不确定如何实现最佳性能,即如果数据结构被锁定,读取器的锁定量最小。使用两个锁是否更好,一个叫做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];
    }

};

我可以在这里使用其他同步技术吗?

3 个答案:

答案 0 :(得分:2)

您需要Readers–writer lock。但你应该考虑到在某些场景中,rw锁可能比独占锁更慢

有很多实现,例如在boost。 WinAPI还有one(自Vista或Server 2008以来)

答案 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,它实现了读写锁定),但没有解释为什么需要它。