c++ - 运算符 [] 中的互斥量

标签 c++ operator-overloading mutex

我想做这样的事情:

class BlockingVector{
protected:
    std::vector<int> m_vector;
    std::mutex m_mutex;
public:
    int & operator [](size_t p_index){
        std::lock_guard<std::mutex> lock(m_mutex);
        return m_vector[p_index];
    }
};

我知道,这是完全错误的。 有没有办法用互斥量重载运算符 []?

正如 Nikos C 所说:它返回对元素的引用,而不是拷贝。因此使用该元素不是线程安全的。

最佳答案

您可以定义一个“locked_reference”辅助类,它在其构造函数中获取锁并在析构函数中释放锁,并将其用作 operator[] 的返回值:

template<class T> class BlockingVector{
private:
    std::vector<T> m_vector;
    std::recursive_mutex m_mutex;
    class locked_ref {
        T &ref
        lock_guard<std::recursive_mutex> lock;
    public:
        locked_ref(T &r, std::recursive_mutex &m) : ref(r), lock(m) {}
        locked_ref(locked_ref &&) = default;
        const T &operator=(const T &v) const { return ref = v; }
        operator T() const { return ref; }
    }; 
public:
    locked_ref operator [](size_t p_index){
        return locked_ref(m_vector[p_index], m_mutex); }
};

您需要一个 recursive_mutex,因为线程需要多次锁定它以评估类似以下内容:

v[i] = v[j] + v[k];

如果两个线程同时对两个 vector 进行操作,则存在死锁的危险。

关于c++ - 运算符 [] 中的互斥量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47503928/

相关文章:

c - Linux 中进程的互斥量

c# - 从 .NET 附加到 COM 服务器中的事件时出现 E_ACCESSDENIED 异常

c++ - 如何在 C++ 中的两个类之间定义(重载)对称二元运算符,同时考虑 r 值?

C#后缀和前缀递增/递减重载区别

c++ - 一个线程如何做某事而不是等待条件变量

有人可以解释这两个问题的解决方案(c 程序,互斥体,线程)吗?

c++ - 无法访问同一类的私有(private)成员

c++ - 如何从 'this'创建智能指针?

c++ - 如何在 Visual Studio 中的 CppUnitTestFramework (C++) 中设置超时?

c++ - 重载运算符<<(unsigned char typedef as byte)