gpt4 book ai didi

c++ - 在私有(private)函数中锁定/解锁互斥锁

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:29:37 52 4
gpt4 key购买 nike

假设您有一个大函数,可以锁定/解锁内部的互斥锁,并且您想要将该函数分解为更小的函数:

#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/

52 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com