将监视器方法作为线程参数传递 c++
Passing monitor method as thread parameter c++
我正在编写监视器以相互排除对 std::list
方法的访问
我现在的基本上是这样的:
</p>
<pre><code>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 函数中我创建了一个线程到 运行 添加函数,例如thread t(m.m_add, 1);
我收到错误
error: invalid use of non-static member function
我明白(通过查看这里的其他答案)我应该 运行 中的线程 thread t(&monitor::m_add, 1);
并将所有方法声明为静态的,但我需要实例化 运行 的对象=15=] 以创建互斥体(或锁,或其他)并使它们在 main 的范围内私有。
对于这种情况,最合适的解决方案是什么?如果锁只能在监视器 class 的范围内访问,那会很有趣(顺便说一句,我也打算将来把 list<int> l
放在监视器 class 中。 )
你的线程函数必须是静态的。要从线程访问成员函数,请在创建对象时将指向对象的指针传递给线程函数。
我正在编写监视器以相互排除对 std::list
方法的访问
我现在的基本上是这样的:
</p>
<pre><code>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 函数中我创建了一个线程到 运行 添加函数,例如thread t(m.m_add, 1);
我收到错误
error: invalid use of non-static member function
我明白(通过查看这里的其他答案)我应该 运行 中的线程 thread t(&monitor::m_add, 1);
并将所有方法声明为静态的,但我需要实例化 运行 的对象=15=] 以创建互斥体(或锁,或其他)并使它们在 main 的范围内私有。
对于这种情况,最合适的解决方案是什么?如果锁只能在监视器 class 的范围内访问,那会很有趣(顺便说一句,我也打算将来把 list<int> l
放在监视器 class 中。 )
你的线程函数必须是静态的。要从线程访问成员函数,请在创建对象时将指向对象的指针传递给线程函数。