(C++) mutex

Posted by : at

Category : Cpp


가장 간단하게 mutex써보기

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

void PrintMessage(const std::string& message)
{
    static std::mutex sMutex;
    // 물론 이런식으로 static을 쓰는건 좋지 못한 습관

    sMutex.lock();
    std::cout << message << std::endl;
    sMutex.unlock();
}

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

    thread.join();

    return 0;
}

이런 실수가 발생할 수 있다.

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

void PrintMessage(const std::string& message)
{
    static std::mutex sMutex;
    // 물론 이런식으로 static을 쓰는건 좋지 못한 습관

    sMutex.lock();
    std::cout << message << std::endl;
    // sMutex.unlock();
    // unlock을 안한경우
}

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

    thread.join();

    return 0;
}

scoped_lock으로 해결해보자

void PrintMessage(const std::string& message)
{
    static std::mutex sMutex;
    // 물론 이런식으로 static을 쓰는건 좋지 못한 습관

    std::scoped_lock<std::mutex> lock(sMutex);
    std::cout << message << std::endl;
}
void PrintMessage(const std::string& message)
{
    static std::mutex sMutex;
    // 물론 이런식으로 static을 쓰는건 좋지 못한 습관

    // 다음과 같이 나눌 경우 scoped_lock을 별도로 걸 수 있다.
    {
        std::scoped_lock<std::mutex> lock(sMutex);
        std::cout << message << std::endl;    
    }

    {
        std::scoped_lock<std::mutex> lock(sMutex);
        std::cout << message << std::endl;    
    }
}

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links