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

标签 c++ pthreads mutex

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

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

相关文章:

c++ - OpenGL 中顶点数组缓冲区绘制的每个函数有什么作用?

c++ - 使用带有数组的 find_if() 的代码段出错

c++ - 在 CMake 中,将属性(查找包含的目录)注入(inject)到依赖于给定 header 的文件

c - 多线程正在以选项卡形式写入输出

C,转换通过 void 指针传递的结构数组

c++ - 访问使用接口(interface)实例化的类的私有(private)成员

linux - Linux 中的 pthread 概念

c - 没有引用 pthread_mutex_lock 编译 -lpthread

c++ - 互斥锁在 Linux 中没有像我希望的那样工作

c++ - boost::mutex,pthread_mutex_destroy 失败 - 调试建议?