1. ホーム
  2. c++

[解決済み] c++でunique_lockを使用/作成する方法は?

2022-02-17 19:14:49

質問内容

どなたか、c++でunique_lockの使い方、作り方を教えてください。 これは、モニタの任意のプロシージャに対する相互排除を得るためと、条件変数に対してwait()を実行できるようにするために使用されるはずです。mutexが必要なのでしょうか?以下は擬似コードです。

/* compile with g++, flags -std=c++0x -lpthread */

#include <condition_variable>
#include <mutex>
#include <thread>
#include <iostream>
#include <string.h>
#include <unistd.h>

class monitorTh {

private:

    std::mutex m;
    std::condition_variable waitP;
    std::condition_variable waitC;
    char element[32];
    std::unique_lock::unique_lock l;

public:
    void produce(char* elemProd) {
        l.lock();
        if (/*already_present_element*/) {
            waitP.wait(l);
        }
        else {/*produce element*/}
        l.unlock();
    }

    void consume() {
        /*something specular*/
    }
};

int main(int argc, char* argv[]) {

    monitorTh* monitor = new monitorTh();
    char prodotto[32] = "oggetto";

    std::thread producer([&]() {
        monitor->produce(prodotto);
    });

    std::thread consumer([&]() {
        monitor->consume();
    });

    producer.join();
    consumer.join();
}

解決方法は?

std::unique_lock を使用します。 RAII パターンを使用します。

ミューテックスをロックする場合、以下のような型のローカル変数を作成します。 std::unique_lock をパラメータとして渡します。unique_lock が構築されると、mutex がロックされ、それが破壊されると、mutex がアンロックされます。さらに重要なことは 例外が発生した場合 std::unique_lock デストラクタ が呼び出されるので、ミューテックスがアンロックされます。

#include<mutex>
int some_shared_var=0;

int func() {
    int a = 3;
    { //Critical section
        std::unique_lock<std::mutex> lock(my_mutex);
        some_shared_var += a;
    } //End of critical section
}