【发布时间】:2013-09-16 13:20:38
【问题描述】:
假设您有一个大函数可以锁定/解锁内部的互斥体,并且您想将该函数分解为更小的函数:
#include <pthread.h>
class MyClass : public Uncopyable
{
public:
MyClass() : m_mutexBuffer(PTHREAD_MUTEX_INITIALIZER), m_vecBuffer() {}
~MyClass() {}
void MyBigFunction()
{
pthread_mutex_lock(&m_mutexBuffer);
if (m_vecBuffer.empty())
{
pthread_mutex_unlock(&m_mutexBuffer);
return;
}
// DoSomethingWithBuffer1();
unsigned char ucBcc = CalculateBcc(&m_vecBuffer[0], m_vecBuffer.size());
// DoSomethingWithBuffer2();
pthread_mutex_unlock(&m_mutexBuffer);
}
private:
void DoSomethingWithBuffer1()
{
// Use m_vecBuffer
}
void DoSomethingWithBuffer2()
{
// Use m_vecBuffer
}
private:
pthread_mutex_t m_mutexBuffer;
std::vector<unsigned char> m_vecBuffer;
};
我应该如何在较小的函数中锁定/解锁互斥锁?
我应该先解锁互斥锁,然后直接锁定,最后解锁后再返回吗?
void DoSomethingWithBuffer1()
{
pthread_mutex_unlock(&m_mutexBuffer);
pthread_mutex_lock(&m_mutexBuffer);
// Use m_vecBuffer
pthread_mutex_unlock(&m_mutexBuffer);
}
【问题讨论】:
-
如果 m_vecBuffer 为空,则返回并且永远不会解锁互斥锁?
-
编辑后:您的“修复”不是正确的解决方案。使用 RAII 保护对象。
-
我已经在我的真实代码中使用了 ScopedLock RAII 类,但还是感谢 gx_ 指出这一点。