2

我正在编写一个监视器来相互排除对 a 方法的访问std::list 我现在拥有的基本上是这样的:

list<int> l;
class monitor{
    public:
    void m_add(int x){
        //lock use of m_remove
        //lock use of m_add
        l.push_back(x);
        //unlock use of m_add
        //unlock use of m_remove
    }
    void m_remove(int x){
        //lock use of m_remove
        //lock use of m_contains
        //lock use of m_add
        l.remove(x);
        //unlock use of m_add
        //unlock use of m_contains
        //unlock use of m_remove
    }
    bool m_contains(int x){
        //lock use of m_remove
        bool found = find(l.begin(), l.end(), x) != l.end();
        //unlock use of m_remove
        return found;
    }
    private:
    mutex mtx_remove;
    mutex mtx_add;
    mutex mtx_contains;
};

在 main 函数中,我创建了一个线程来运行 add 函数,例如thread t(m.m_add, 1);,我得到了错误

error: invalid use of non-static member function

我知道(通过查看此处的其他答案)我应该像 in 一样运行线程thread t(&monitor::m_add, 1);并将所有方法声明为静态,但我需要实例化一个对象monitor以创建互斥锁(或锁或其他)并制作它们在 main 的范围内是私有的。

这种情况下最合适的解决方案是什么?如果锁只能在监视器类的范围内访问会很有趣(顺便说一句,我还打算list<int> l将来把它放在监视器类中。)

4

1 回答 1

0

您的线程函数必须是静态的。要从线程访问成员函数,请在创建对象时将指向对象的指针传递给线程函数。

于 2018-05-16T17:41:42.573 回答