std:: mutex
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Locking | ||||
| Native handle | ||||
|
헤더 파일에 정의됨
<mutex>
|
||
|
class
mutex
;
|
(C++11부터) | |
mutex
클래스는 여러 스레드가 동시에 접근하는 것으로부터 공유 데이터를 보호하는 데 사용할 수 있는 동기화 기본 요소입니다.
mutex
는 배타적이고 비재귀적인 소유권 의미론을 제공합니다:
-
호출 스레드는
lock또는try_lock을 성공적으로 호출한 시점부터unlock을 호출할 때까지mutex를 소유 합니다. -
한 스레드가
mutex를 소유하고 있을 때, 다른 모든 스레드는 해당mutex의 소유권을 획득하려고 시도하면 (lock호출 시) 차단되거나 (try_lock호출 시) false 반환 값을 받게 됩니다. -
호출 스레드는
lock또는try_lock을 호출하기 전에mutex를 소유하고 있지 않아야 합니다.
어떤 스레드가 여전히 소유하고 있는 상태에서
mutex
가 파괴되거나, 스레드가
mutex
를 소유한 상태로 종료되는 경우 프로그램의 동작은 정의되지 않습니다.
mutex
클래스는
Mutex
와
StandardLayoutType
의 모든 요구 사항을 충족합니다.
std::mutex
는 복사 가능하지도 이동 가능하지도 않습니다.
목차 |
중첩 타입
| 이름 | 정의 |
native_handle_type
(
선택적*
)
|
구현 정의 |
멤버 함수
|
뮤텍스를 생성함
(public member function) |
|
|
뮤텍스를 파괴함
(public member function) |
|
|
operator=
[deleted]
|
복사 할당 불가
(public member function) |
잠금 |
|
|
뮤텍스를 잠금, 뮤텍스를 사용할 수 없는 경우 차단됨
(public member function) |
|
|
뮤텍스 잠금을 시도함, 뮤텍스를 사용할 수 없는 경우 반환됨
(public member function) |
|
|
뮤텍스 잠금을 해제함
(public member function) |
|
네이티브 핸들 |
|
|
구현 정의된 기본 네이티브 핸들 객체를 반환함
(public member function) |
|
참고 사항
std::mutex
는 일반적으로 직접 접근되지 않습니다:
std::unique_lock
,
std::lock_guard
,
또는
std::scoped_lock
(C++17 이후)
가 더 예외 안전한 방식으로 잠금을 관리합니다.
예제
이 예제는 두 스레드 간에 공유되는
mutex
가
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
참고 항목
|
(C++11)
|
같은 스레드에서 재귀적으로 잠글 수 있는 상호 배제 기능을 제공함
(class) |
|
(C++11)
|
엄격한 범위 기반 뮤텍스 소유권 래퍼를 구현함
(class template) |
|
(C++11)
|
이동 가능한 뮤텍스 소유권 래퍼를 구현함
(class template) |
|
(C++17)
|
데드락을 방지하는 다중 뮤텍스 RAII 래퍼
(class template) |
|
(C++11)
|
std::unique_lock
과 연관된 조건 변수를 제공함
(class) |