C++11 동시 다발 지침 std::mutex 상세 설명

8076 단어 C++11std::mutex
지난 편 에서 주로 std:thread 의 용법 을 말 했 고 두 가지 작은 예 를 제시 했다.본 고 는 std::mutex 의 용법 을 소개 할 것 이다.
Mutex 는 상호 배척 량 이 라 고도 부 릅 니 다.C+11 에서 Mutex 와 관련 된 클래스(잠 금 형식 포함)와 함 수 는 모두헤더 파일 에 설명 되 어 있 기 때문에 std::mutex 를 사용 하려 면헤더 파일 을 포함해 야 합 니 다.
헤더 파일 소개
Mutex 시리즈 클래스(4 가지)
  • std::mutex,가장 기본 적 인 Mutex 류.
  • std::recursive_mutex,Mutex 클래스 로 귀속.
  • std::time_mutex,정시 Mutex 클래스.
  • std::recursive_timed_mutex,정시 에 Mutex 류 로 귀속.
  • Lock 클래스(두 가지)
  • std::lock_guard,Mutex RAII 와 관련 하여 스 레 드 가 상호 배척 량 에 잠 그 는 것 을 편리 하 게 합 니 다.
  • std::unique_lock,Mutex RAII 와 관련 하여 스 레 드 가 상호 배척 량 에 잠 그 는 것 을 편리 하 게 하지만 더 좋 은 잠 금 해제 와 잠 금 해제 통 제 를 제공 합 니 다.
  • 기타 유형
  • std::once_flag
  • std::adopt_lock_t
  • std::defer_lock_t
  • std::try_to_lock_t
  • 함수.
  • std::try_lock,여러 개의 상호 배척 량 을 동시에 잠 그 려 고 시도 합 니 다.
  • std:lock,여러 개의 상호 배척 량 을 동시에 잠 글 수 있 습 니 다.
  • std::call_once,여러 스 레 드 가 함 수 를 동시에 호출 해 야 한다 면,callonce 는 여러 스 레 드 가 이 함수 에 대해 한 번 만 호출 할 수 있 도록 보장 할 수 있 습 니 다.
  • std::mutex 소개
    다음은 std::mutex 를 예 로 들 어 C+11 의 상호 배척 용법 을 소개 합 니 다.
    std::mutex 는 C++11 에서 가장 기본 적 인 상호 배척 량 입 니 다.std:mutex 대상 은 독점 소유권 의 특성 을 제공 합 니 다.즉,재 귀적 으로 std::mutex 대상 에 잠 그 는 것 을 지원 하지 않 습 니 다.std::recursivelock 은 상호 배척 대상 을 재 귀적 으로 잠 글 수 있 습 니 다.
    std::mutex 의 구성원 함수
  • 구조 함수,std::mutex 는 복사 구 조 를 허용 하지 않 고 move 복사 도 허용 하지 않 습 니 다.처음에 발생 한 mutex 대상 은 unlocked 상태 에 있 습 니 다.
  • lock(),호출 스 레 드 는 이 상호 배척 량 을 잠 글 것 입 니 다.스 레 드 가 이 함 수 를 호출 하면 다음 과 같은 세 가지 상황 이 발생 합 니 다.(1)이 스 레 드 가 현재 잠 겨 있 지 않 으 면 스 레 드 를 호출 하여 이 스 레 드 를 잠 금 합 니 다.unlock 을 호출 하기 전에 이 스 레 드 는 이 자 물 쇠 를 가지 고 있 습 니 다.(2).현재 상호 배척 량 이 다른 스 레 드 에 잠 겨 있 으 면 현재 호출 스 레 드 가 막 힙 니 다.(3).현재 호출 된 스 레 드 에 잠 겨 있 으 면 잠 금(deadlock)이 발생 합 니 다.
  • unlock(),잠 금 해제,상호 배척 량 에 대한 소유권 방출.
  • try_lock(),상호 반 론 량 을 잠 그 려 고 시도 합 니 다.만약 상호 반 론 량 이 다른 스 레 드 에 의 해 점유 된다 면 현재 스 레 드 도 막 히 지 않 습 니 다.스 레 드 호출 이 함수 도 다음 세 가지 상황 이 발생 합 니 다.(1)현재 상호 배척 량 이 다른 스 레 드 에 의 해 점유 되 지 않 았 다 면 이 스 레 드 는 상호 배척 량 을 잠 그 고 이 스 레 드 가 unlock 을 호출 하여 상호 배척 량 을 방출 할 때 까지 잠 금 합 니 다.(2).현재 상호 배척 량 이 다른 스 레 드 에 잠 겨 있 으 면 현재 호출 스 레 드 는 false 로 돌아 가 고 막 히 지 않 습 니 다.(3).현재 호출 된 스 레 드 에 잠 겨 있 으 면 잠 금(deadlock)이 발생 합 니 다.
  • 다음은 std::mutex 와 의 작은 예(C++11 동시 다발 안내 2(std::thread 상세 설명))를 보 여 줍 니 다.
    
    #include <iostream>  // std::cout
    #include <thread>   // std::thread
    #include <mutex>   // std::mutex
    
    volatile int counter(0); // non-atomic counter
    std::mutex mtx;   // locks access to counter
    
    void attempt_10k_increases() {
     for (int i=0; i<10000; ++i) {
      if (mtx.try_lock()) { // only increase if currently not locked:
       ++counter;
       mtx.unlock();
      }
     }
    }
    
    int main (int argc, const char* argv[]) {
     std::thread threads[10];
     for (int i=0; i<10; ++i)
      threads[i] = std::thread(attempt_10k_increases);
    
     for (auto& th : threads) th.join();
     std::cout << counter << " successful increases of the counter.
    "; return 0; }
    std::recursive_mutex 소개
    std::recursive_mutex 는 std::mutex 와 마찬가지 로 잠 길 수 있 는 대상 이지 만 std::mutex 와 달리 std::recursivemutex 는 같은 스 레 드 가 상호 배척 량 에 대해 여러 번 잠 금(즉,재 귀 잠 금)을 허용 하여 상호 배척 대상 에 대한 다 층 소유권 을 얻 을 수 있 습 니 다.std::recursivemutex 가 상호 배척 량 을 방출 할 때 이 자물쇠 의 깊이 와 같은 횟수 의 unlock()을 호출 해 야 합 니 다.lock()횟수 와 unlock()횟수 가 같 습 니 다.그 밖 에 std::recursivemutex 의 특성 은 std::mutex 와 대체적으로 같 습 니 다.
    std::time_mutex 소개
    std::time_mutex 는 std::mutex 보다 두 개의 구성원 함수 가 많 습 니 다.trylock_for(),try_lock_until()。
    try_lock_for 함수 가 시간 범 위 를 받 아들 이 는 것 은 이 시간 범위 내 에서 스 레 드 가 자 물 쇠 를 얻 지 못 하면 막 히 는 것 을 나타 낸다(std:mutex 의 trylock()다르다,trylock 이 호출 되 었 을 때 자 물 쇠 를 얻 지 못 하면 false 로 돌아 갑 니 다.이 기간 에 다른 스 레 드 가 자 물 쇠 를 풀 었 다 면 이 스 레 드 는 서로 배척 하 는 자 물 쇠 를 얻 을 수 있 습 니 다.시간 이 초과 되 었 을 때(즉,지정 한 시간 내 에 자 물 쇠 를 얻 지 못 했 을 때)false 로 돌아 갑 니 다.
    try_lock_until 함 수 는 하나의 시간 점 을 매개 변수 로 받 아들 입 니 다.지정 한 시간 점 이 오기 전에 스 레 드 가 자 물 쇠 를 얻 지 못 하면 막 힙 니 다.이 기간 에 다른 스 레 드 가 자 물 쇠 를 풀 면 이 스 레 드 는 상호 배척 량 에 대한 자 물 쇠 를 얻 을 수 있 습 니 다.시간 이 초과 되면(즉,지정 한 시간 내 에 자 물 쇠 를 얻 지 못 했 습 니 다)false 로 돌아 갑 니 다.
    아래 의 작은 예 는 std::time 를 설명 합 니 다.mutex 의 용법(레 퍼 런 스).
    
    #include <iostream>  // std::cout
    #include <chrono>   // std::chrono::milliseconds
    #include <thread>   // std::thread
    #include <mutex>   // std::timed_mutex
    
    std::timed_mutex mtx;
    
    void fireworks() {
     // waiting to get a lock: each thread prints "-" every 200ms:
     while (!mtx.try_lock_for(std::chrono::milliseconds(200))) {
     std::cout << "-";
     }
     // got a lock! - wait for 1s, then this thread prints "*"
     std::this_thread::sleep_for(std::chrono::milliseconds(1000));
     std::cout << "*
    "; mtx.unlock(); } int main () { std::thread threads[10]; // spawn 10 threads: for (int i=0; i<10; ++i) threads[i] = std::thread(fireworks); for (auto& th : threads) th.join(); return 0; }
    std::recursive_timed_mutex 소개
    std:recursivemutex 는 std::mutex 와 의 관계 가 같 습 니 다.std::recursivetimed_mutex 의 특성 도 std::timedmutex 유도,관심 있 는 신발 은 스스로 찾 아 볼 수 있 습 니 다.;-)
    std::lock_guard 소개
    Mutex RAII 와 관련 하여 스 레 드 가 상호 배척 량 에 잠 그 는 것 을 편리 하 게 합 니 다.예(레 퍼 런 스):
    
    #include <iostream>  // std::cout
    #include <thread>   // std::thread
    #include <mutex>   // std::mutex, std::lock_guard
    #include <stdexcept>  // std::logic_error
    
    std::mutex mtx;
    
    void print_even (int x) {
     if (x%2==0) std::cout << x << " is even
    "; else throw (std::logic_error("not even")); } void print_thread_id (int id) { try { // using a local lock_guard to lock mtx guarantees unlocking on destruction / exception: std::lock_guard<std::mutex> lck (mtx); print_even(id); } catch (std::logic_error&) { std::cout << "[exception caught]
    "; } } int main () { std::thread threads[10]; // spawn 10 threads: for (int i=0; i<10; ++i) threads[i] = std::thread(print_thread_id,i+1); for (auto& th : threads) th.join(); return 0; }
    std::unique_lock 소개
    Mutex RAII 와 관련 하여 스 레 드 가 상호 배척 량 에 잠 그 는 것 을 편리 하 게 하지만 더 좋 은 잠 금 해제 와 잠 금 제 어 를 제공 합 니 다.예(레 퍼 런 스):
    
    #include <iostream>  // std::cout
    #include <thread>   // std::thread
    #include <mutex>   // std::mutex, std::unique_lock
    
    std::mutex mtx;   // mutex for critical section
    
    void print_block (int n, char c) {
     // critical section (exclusive access to std::cout signaled by lifetime of lck):
     std::unique_lock<std::mutex> lck (mtx);
     for (int i=0; i<n; ++i) {
      std::cout << c;
     }
     std::cout << '
    '; } int main () { std::thread th1 (print_block,50,'*'); std::thread th2 (print_block,50,'$'); th1.join(); th2.join(); return 0; }
    자,본문 은 잠시 여기까지 이야기 하고 std::try 남 았 습 니 다.lock,std::lock,std::call_once 세 함수 가 언급 되 지 않 았 으 니 다음 블 로그 에 남 겨 두 고 이야기 하 세 요.-)
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기