假设您有一个大函数,可以锁定/解锁内部的互斥锁,并且您想要将该函数分解为更小的函数:
#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);
}
最佳答案
How should I go about locking/unlocking the mutex inside the smaller functions?
如果您的语义要求在整个 MyBigFunction()
操作期间锁定您的互斥锁,那么您不能简单地解锁它并在函数中间重新锁定它。
我最好的选择是忽略较小的 DoSomethingWithBuffer...()
函数中的互斥量,并且只要求调用这些函数时互斥量已经被锁定。这应该不是问题,因为这些函数是私有(private)的。
附带说明一下,您的互斥锁使用不正确:它不是异常安全的,并且您的代码路径中没有释放互斥锁。如果您使用的是 C++03,则应该使用 C++11 的互斥锁和锁类或 boost 的等价物。在最坏的情况下,如果您不能使用 boost,请编写一个小的 RAII 包装器来持有锁。
关于c++ - 在私有(private)函数中锁定/解锁互斥锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18829076/