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] |