我不熟悉C ++&多线程。最近看看Lock属性......
假设我有一个内部有互斥的类。当我在互斥对象上使用锁定方法时,我怎么能告诉阻止/锁定哪个部分的编码?它是阻止/锁定类中的所有成员函数还是仅阻止/锁定我触发锁定的成员函数?
e.g。 (process_data& udf_2)
class data_wrapper
{
private:
int x;
some_data data;
std::mutex m;
public:
template<typename Function>
void process_data(Function func)
{
std::lock_guard<std::mutex> l(m);
......
}
void udf_2(int x)
{
cout << "Value is " << x;
......
}
}
=============================
=============================
还有一个问题是,如果我看到模板类型T,那么T&amp;是什么意思?和T&amp;&amp; ?
感谢。
答案 0 :(得分:2)
互斥锁不会锁定您的对象。 mutex提供对程序的一部分的独占访问权限,该程序介于互斥锁和解锁之间。
如果程序的一个线程进入process_data()
并正在读取某个变量,同时另一个线程进入udf_2()
并修改同一个变量,您的程序不是线程安全的< / strong>即可。换句话说,仅在对象内部使用互斥锁不足以保护它。您必须通过像方法process_data()
一样受到保护的方法来管理对变量的访问。只有这样你的程序才是线程安全的。
我希望我说清楚。
答案 1 :(得分:1)
http://en.cppreference.com/w/cpp/thread/lock_guard
正如您在链接中看到的那样,只要程序超出范围(例如process_data()方法),std :: lock_guard就会被破坏。
lock_guard不会锁定所有成员变量,只会锁定在作用域或process_data()中访问的成员变量
答案 2 :(得分:1)
使用
void process_data(Function func)
{
std::lock_guard<std::mutex> l(m);
......
}
表示任何到达此行的线程都不会从锁的构造函数返回,直到任何其他经过锁创建的线程都没有退出作用域。换句话说,使用省略号表示的代码一次只能由一个线程执行,有效地序列化对代码的访问。