4

内部でミューテックスをロック/ロック解除する大きな関数があり、その関数を小さな関数に分割したいとします。

#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);
}
4

2 に答える 2

6

小さな関数内でミューテックスをロック/ロック解除するにはどうすればよいですか?

セマンティクスにより、操作全体でミューテックスをロックする必要がある場合MyBigFunction()は、単純にロックを解除して関数の途中で再ロックすることはできません。

私の最善の策は、小さなDoSomethingWithBuffer...()関数のミューテックスを無視し、これらの関数が既にロックされているミューテックスで呼び出されることを単に要求することです。これらの関数は非公開であるため、これは問題になりません。


余談ですが、ミューテックスの使用法が正しくありません。例外セーフではなく、ミューテックスを解放しないコード パスがあります。C++03 を使用している場合は、C++11 のミューテックスおよびロック クラスを使用するか、ブーストの同等のクラスを使用する必要があります。最悪の場合、boost を使用できない場合は、小さな RAII ラッパーを作成してロックを保持します。

于 2013-09-16T13:24:51.733 に答える