c++多线程互斥锁问题
C++ Multithread Mutex Lock issue
我是c++新手&多线程。最近在看Lock属性…
假设我有一个类里面有一个互斥锁。当我在互斥对象上使用lock方法时,我如何知道代码的哪一部分被阻塞/锁定?它是否阻塞/锁定类内的所有成员函数或仅触发锁定的成员函数?
。(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&
和T&&
是什么意思?
互斥锁不锁定对象。互斥锁提供了对程序中处于互斥锁和解锁之间的部分的独占访问。
如果您的程序的一个线程进入process_data()
并正在读取一些变量,同时另一个线程进入udf_2()
并修改相同的变量,您的程序不是线程安全的。换句话说,仅仅在对象中使用互斥锁是不足以保护它的。你必须通过像process_data()
方法一样被保护的方法来引导对变量的访问。只有这样你的程序才是线程安全的。
http://en.cppreference.com/w/cpp/thread/lock_guard
正如你在链接中看到的,std::lock_guard一旦程序超出作用域(例如process_data()方法)就会被销毁。
lock_guard不锁定所有成员变量,只锁定在process_data()范围内访问的成员变量
使用
void process_data(Function func)
{
std::lock_guard<std::mutex> l(m);
......
}
表示任何到达该行的线程,都不会从锁的构造函数返回,直到其他线程在创建锁之后还没有退出作用域。换句话说,使用省略号表示的代码一次最多只能由一个线程执行,有效地序列化了对代码的访问。
相关文章:
- 尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误
- 在多线程函数中返回共享的常量指针会导致计时问题吗?
- C++多线程生产者-消费者问题
- C++ 多线程中的锁和条件变量问题
- 多线程与线程小问题
- 多线程概念问题
- 在 Linux 中从单独的单线程进程生成多线程进程时出现问题
- 如何解决多线程绘图的问题不流畅
- C++ std::endl 的多线程程序 I/O 问题
- 我遇到了一个关于多线程的小问题.需要多线程来计算 Pi 和方差
- 多线程程序线程联接问题
- 多线程环境中的输出字符串流出现问题
- QT有问题的多线程
- C 多线程TCP服务器问题
- C++-关于多线程的问题
- 在多线程环境中使用Mysql++的问题
- Borland C++-多线程TCPServer问题
- gdal多线程问题
- 从多线程.net应用程序调用的本机dll中的tbb存在问题
- 有关 dup2 和多线程的问题