代码之家  ›  专栏  ›  技术社区  ›  André Winston

将监视器方法作为线程参数c++[duplicate]传递

  •  2
  • André Winston  · 技术社区  · 6 年前

    我正在编写一个监视器,以相互排除对 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
    

    我理解(通过查看这里的其他答案),我应该像中那样运行线程 thread t(&monitor::m_add, 1); 并将所有方法声明为静态,但我需要实例化 monitor 为了创建互斥锁(或锁,或其他什么),并使它们在main的作用域中是私有的。

    对于这种情况,最合适的解决方案是什么?如果锁只在monitor类的范围内可访问,那将很有趣(顺便说一句,我还打算将 list<int> l 以后在monitor类中。)

    1 回复  |  直到 6 年前
        1
  •  0
  •   CarlH    6 年前

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