SW/C++

C++ : std::scoped_lock : 예제, 사용법, 활용법, 실수 방지 방법

얇은생각 2020. 3. 21. 07:30
반응형

C++ mutex scoped_lock

 

Mutex : 흔히 하는 실수

#include <iostream>
#include <chrono>
#include <mutex>
#include <string>
#include <thread>

void PrintMessage(const std::string& message)
{
    static std::mutex sMutex;
    sMutex.lock();
    std::cout << message << std::endl;
    //sMutex.unlock();
}

int main()
{
    std::thread thread(PrintMessage, "Message from a child thread.");

    PrintMessage("Message from a main thread.");

    thread.join();

    return 0;
}

 

return을 사용한다던지, unlock을 작성하지 않은 경우 문제가 발생합니다.

 

 

 

해결 방법 C++17

#include <mutex>
#include <thread>
#include <iostream>
#include <vector>
#include <functional>
#include <chrono>
#include <string>

void PrintMessage(const std::string& message)
{
    static std::mutex sMutex;
    
    std::scoped_lock<std::mutex > lock(sMutex);
    
    std::cout << message << std::endl;
}

int main()
{
    std::thread thread(PrintMessage, "Message from a child thread.");

    PrintMessage("Message from a main thread.");

    thread.join();

    return 0;
}

 

 

 

std::scoped_lock

매개변수로 전달된 뮤텍스들을 내포하는 개체를 만듭니다. 개체 생성시에 뮤텍스를 잠그고 범위를 벗어나 소멸될 떄 풀어줍니다. 즉, 데드락을 방지합니다. C++14 의 경우, std::lock_gurad를 사용할 수 있습니다. 그러나 이떄는 뮤텍스는 하나만 전달 가능합니다.

반응형