class代码
class counter
{
public:
counter(int i)
:m_count(i)
{
}
~counter()
{
}
Mutex m_mutex;
private:
int m_count;
}
void swap(counter &c1,counter &c2)
{
AutoLock lock1(&c1.m_mutex);
AutoLock lock2(&c2.m_mutex);
int v = c1.m_count;
c1.m_count = c2.m_count;
c2.m_count = v;
}
counter a(1);
counter b(2);
thread A 执行swap(a,b);
thread B 执行swap(b,a);
线程A和B同时执行的过程中可能会导致死锁。
解决的方案是,需要保持加锁的顺序是一致的
void swap(counter &c1,counter &c2)
{
//AutoLock lock1(&c1.m_mutex);
//AutoLock lokc2(&c2.m_mutex);
if(&c1.m_mutex < &c2.m_mutex)
{
AutoLock lock1(&c1.m_mutex);
AutoLock lock2(&c2.m_mutex);
}
else
{
AutoLock lock2(&c2.m_mutex);
AutoLock lock1(&c1.m_mutex);
}
int v = c1.m_count;
c1.m_count = c2.m_count;
c2.m_count = v;
}