thread_mutex

thread_mutex (뮤텍스)

mutex 클래스는 여러 스레드가 공유 데이터에 동시에 접근하지 못하도록 보호하는 동기화 기본 요소예요. 이 페이지에서는 std::mutex의 소유권 의미론, 멤버 함수, 그리고 실제 사용 예시를 확인할 수 있어요.

출처: cppreference

본문

개요

<mutex> 헤더에 정의되어 있으며, C++11부터 사용할 수 있어요.

mutex 클래스는 여러 스레드가 공유 데이터에 동시에 접근하는 것을 방지하기 위해 사용하는 동기화 기본 요소예요. mutex는 배타적이고 비재귀적인 소유권 의미론을 제공해요:

  • 호출 스레드는 lock 또는 try_lock을 성공적으로 호출한 시점부터 unlock을 호출할 때까지 뮤텍스를 소유해요.
  • 한 스레드가 뮤텍스를 소유하고 있으면, 다른 모든 스레드는 lock 호출 시 차단되거나 try_lock 호출 시 false를 반환받아요.
  • 호출 스레드는 lock이나 try_lock을 호출하기 전에 뮤텍스를 소유하고 있으면 안 돼요.

뮤텍스가 여전히 어떤 스레드에 의해 소유된 상태에서 파괴되거나, 스레드가 뮤텍스를 소유한 채로 종료되면 프로그램의 동작은 정의되지 않아요. mutex 클래스는 Mutex와 StandardLayoutType의 모든 요구 사항을 충족해요.

std::mutex는 복사도 이동도 할 수 없어요.

중첩 타입

이름 정의
native_handle_type (선택*) 구현 정의 [edit]

멤버 함수

(생성자) 뮤텍스를 생성해요 (공개 멤버 함수) [edit]
(소멸자) 뮤텍스를 파괴해요 (공개 멤버 함수) [edit]
operator= [deleted] 복사 대입할 수 없어요 (공개 멤버 함수) [edit]
잠금
lock 뮤텍스를 잠가요. 뮤텍스를 사용할 수 없으면 차단돼요 (공개 멤버 함수) [edit]
try_lock 뮤텍스 잠금을 시도해요. 뮤텍스를 사용할 수 없으면 반환해요 (공개 멤버 함수) [edit]
unlock 뮤텍스의 잠금을 해제해요 (공개 멤버 함수) [edit]
네이티브 핸들
native_handle 구현 정의된 네이티브 핸들 객체를 반환해요 (공개 멤버 함수) [edit]

참고 사항

std::mutex는 보통 직접 접근하지 않아요. std::unique_lock, std::lock_guard, 또는 std::scoped_lock(C++17부터)이 더 예외에 안전한 방식으로 잠금을 관리해 줘요.

예제

이 예제는 두 스레드가 공유하는 std::map을 보호하기 위해 뮤텍스를 사용하는 방법을 보여줘요.

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

std::map<std::string, std::string> g_pages;
std::mutex g_pages_mutex;

void save_page(const std::string& url)
{
    // simulate a long page fetch
    std::this_thread::sleep_for(std::chrono::seconds(2));
    std::string result = "fake content";
    
    std::lock_guard<std::mutex> guard(g_pages_mutex);
    g_pages[url] = result;
}

int main() 
{
    std::thread t1(save_page, "http://foo");
    std::thread t2(save_page, "http://bar");
    t1.join();
    t2.join();
    
    // safe to access g_pages without lock now, as the threads are joined
    for (const auto& [url, page] : g_pages)
        std::cout << url << " => " << page << '\n';
}

출력:

http://bar => fake content
http://foo => fake content

같이 보기

recursive_mutex (C++11) 같은 스레드가 재귀적으로 잠글 수 있는 상호 배제 기능을 제공해요 (클래스) [edit]
lock_guard (C++11) 엄격한 범위 기반 뮤텍스 소유권 래퍼를 구현해요 (클래스 템플릿) [edit]
unique_lock (C++11) 이동 가능한 뮤텍스 소유권 래퍼를 구현해요 (클래스 템플릿) [edit]
scoped_lock (C++17) 여러 뮤텍스를 위한 교착 상태 방지 RAII 래퍼예요 (클래스 템플릿) [edit]
condition_variable (C++11) std::unique_lock과 연관된 조건 변수를 제공해요 (클래스) [edit]

더 알아보기 (Learn more)

cppreference