65,187
社区成员




std::mutex 的成员函数
构造函数,std::mutex不允许拷贝构造,也不允许 move 拷贝,最初产生的 mutex 对象是处于 unlocked 状态的。
lock(),调用线程将锁住该互斥量。线程调用该函数会发生下面 3 种情况:
(1). 如果该互斥量当前没有被锁住,则调用线程将该互斥量锁住,直到调用 unlock之前,该线程一直拥有该锁。
(2). 如果当前互斥量被其他线程锁住,则当前的调用线程被阻塞住。
(3). 如果当前互斥量被当前调用线程锁住,则会产生死锁(deadlock)。
(3). 如果当前互斥量被当前调用线程锁住,则会产生死锁(deadlock)。
如果该互斥量当前没有被锁住,则调用线程将该互斥量锁住,直到调用 unlock之前,该线程一直拥有该锁。
(2). 如果当前互斥量被其他线程锁住,则当前的调用线程被阻塞住。
(3). 如果当前互斥量被当前调用线程锁住,则会产生死锁(deadlock)。
void mythread::dealock() {
std::mutex g_pages_mutex;
std::lock_guard<std::mutex> guard(g_pages_mutex);
std::lock_guard<std::mutex> guard(g_pages_mutex); // 这里死锁
}
void mythread::nondealock() {
std::mutex g_pages_mutex;
std::lock_guard<std::recursive_mutex> guard(g_pages_mutex);
std::lock_guard<std::recursive_mutex> guard(g_pages_mutex); // 这里不会死锁
}
#include <iostream>
#include <mutex>
class myTestMutex
{
public:
myTestMutex(int m_m) : m(m_m) {}
~myTestMutex() {}
void Add(int number)
{
m_mutex.lock();
m += number;
m_mutex.unlock();
}
void PlusOne()
{
m_mutex.lock();
Add(1);
m_mutex.unlock();
}
private:
std::mutex m_mutex;
int m;
};
int main()
{
myTestMutex test(0);
//调用Add方法是没有问题的,而且有原子操作的效果。
test.Add(10);
//但是一定调用PlusOne方法就出现问题了,因为进入PlusOne方法的时候会调用m_mutex.lock()方法,
//还没有调用m_mutex.unlock()方法就马上进入Add方法了,然后Add方法马上又调用了m_mutex.lock(),
//然后m_mutex.lock()因为前面在PlusOne方法调用m_mutex.lock()方法,所以就出现阻塞,然后在Add方法就走不下去了,
//然后因为PlusOne方法调用了Add方法,所以导致PlusOne方法也走不下去了,出现死锁了。
test.PlusOne();
}