Сколько мьютексов должно быть использовано в одном потоке

Я работаю над проектом C++ (11) и в основном потоке, мне нужно проверить значение двух переменных. Значение двух переменных будет установлено другими потоками с помощью двух разных обратных вызовов. Я использую две условные переменные для уведомления об изменениях этих двух переменных. Поскольку в C++ блокировки необходимы для условных переменных, я не уверен, должен ли я использовать один и тот же мьютекс для двух условных переменных или мне следует использовать два мьютекса для минимизации исключительного выполнения. Так или иначе, я чувствую, что одного мьютекса должно быть достаточно, потому что в одном потоке (в данном случае основном) код все равно будет выполняться последовательно. Код в главном потоке, который проверяет (ждет) значение двух переменных, в любом случае не будет чередоваться. Дайте мне знать, если вам понадобится написать код для иллюстрации проблемы. Я могу подготовить это. Благодарю.

Обновите, добавьте код:

#include <mutex>

class SomeEventObserver {
public:
    virtual void handleEventA() = 0;
    virtual void handleEventB() = 0;
};

class Client : public SomeEventObserver {
public:
    Client() {
        m_shouldQuit = false;
        m_hasEventAHappened = false;
        m_hasEventBHappened = false;
    }

    // will be callbed by some other thread (for exampe, thread 10)
    virtual void handleEventA() override {
        {
            std::lock_guard<std::mutex> lock(m_mutexForA);
            m_hasEventAHappened = true; 
        }

        m_condVarEventForA.notify_all();
    }


    // will be called by some other thread (for exampe, thread 11)
    virtual void handleEventB() override {
        {
            std::lock_guard<std::mutex> lock(m_mutexForB);
            m_hasEventBHappened = true; 
        }
        m_condVarEventForB.notify_all();
    }


    // here waitForA and waitForB are in the main thread, they are executed sequentially 
    // so I am wondering if I can use just one mutex to simplify the code
    void run() {
        waitForA();
        waitForB();
    }

    void doShutDown() {
        m_shouldQuit =  true;
    }

private:
    void waitForA() {
        std::unique_lock<std::mutex> lock(m_mutexForA);
        m_condVarEventForA.wait(lock, [this]{ return m_hasEventAHappened; });
    }

    void waitForB() {
        std::unique_lock<std::mutex> lock(m_mutexForB);
        m_condVarEventForB.wait(lock, [this]{ return m_hasEventBHappened; });
    }

    // I am wondering if I can use just one mutex
    std::condition_variable m_condVarEventForA;
    std::condition_variable m_condVarEventForB;
    std::mutex m_mutexForA;
    std::mutex m_mutexForB;
    bool m_hasEventAHappened;
    bool m_hasEventBHappened;

    };

int main(int argc, char* argv[]) {
    Client client;
    client.run();
}

0 ответов

Другие вопросы по тегам