C++11 멀티스레드 - Mutex(1)

3427 단어
mutex는 공유 변수에 대한 상호 배척 접근을 제공하는 데 사용되는 상호 배척량이라고도 부른다.C++11의 mutex 관련 클래스는 헤더 파일에 있습니다.총 네 가지 상호 배척 클래스:
번호
이름
용도

std::mutex
가장 기본적이고 가장 자주 사용하는 상호 배척류

std::recursive_mutex
같은 스레드에서 귀속(재입)할 수 있는 상호 배척 클래스

std::timed_mutex
mutex 기능 외에 시한부 요청 잠금 능력도 제공합니다

std::recursive_timed_mutex
같은 스레드에서 반복(재입력)할 수 있는timed_mutex
std::thread와 마찬가지로mutex 관련 클래스는 복사 구조를 지원하지 않으며 값을 부여하지 않습니다.이 동시에mutex류는move의 의미 (move구조,move부치) 를 지원하지 않습니다.이런 조작을 오용할 염려는 없다. 정말 이렇게 하려면 컴파일러가 너를 막을 것이다.

하나, lock,try_lock, unlock


mutex의 표준 조작, 네 개의 mutex 클래스는 모두 이러한 조작을 지원하지만, 다른 클래스는 행위에 약간의 차이가 있다.

1.1 lock


상호 배척량을 잠그다.lock을 호출할 때 세 가지 상황이 있습니다.
  • 만약 호출량이 잠기지 않았다면, 호출 라인은 이mutex를 잠그고, 호출 라인이 unlock을 호출할 때까지 잠그십시오
  • 만약mutex가 다른 루틴lock에 의해 호출되었다면, 다른 루틴unlock이mutex..
  • 만약에 현재mutex가 호출자 라인에 잠겼으면std::mutex가 잠겼고recursive 시리즈는 성공적으로 돌아왔습니다

  • 1.2 try_lock


    mutex를 잠그고 이 함수를 호출하는 것도 세 가지가 있습니다.
  • 만약 호출량이 잠기지 않았다면, 호출 라인은 이mutex를 잠그고 (true) 호출 라인이 unlock을 호출할 때까지 잠그십시오
  • 만약mutex가 다른 루트lock에 의해 호출되면 루트가 실패하고false로 되돌아옵니다
  • 만약에 현재mutex가 호출자 라인에 잠겼으면std::mutex가 잠겼고,recursive 시리즈는true로 되돌아오는 데 성공했습니다..

  • 1.3 unlock


    무텍스를 잠그고 무텍스에 대한 소유권을 해제합니다.특히 Recursive 시리즈mutex에 대해 unlock 횟수는 lock 횟수와 같아야 잠금을 완전히 풀 수 있습니다.다음은 무텍스의 작은 예를 보여 드리겠습니다.
    #include 
    #include 
    #include 
    
    void inc(std::mutex &mutex, int loop, int &counter) {
        for (int i = 0; i < loop; i++) {
            mutex.lock();
            ++counter;
            mutex.unlock();
        }
    }
    int main() {
        std::thread threads[5];
        std::mutex mutex;
        int counter = 0;
    
        for (std::thread &thr: threads) {
            thr = std::thread(inc, std::ref(mutex), 1000, std::ref(counter));
        }
        for (std::thread &thr: threads) {
            thr.join();
        }
    
        //  :5000, inc try_lock, <5000
        std::cout << counter << std::endl;
    
        return 0;
    }
    //: g++ -std=c++11 main.cpp
    

    둘,try_lock_for, try_lock_until


    이 두 함수는timed 시리즈의mutex(std::timed_mutex,std::recursive_timed_mutex)에만 사용되며, 함수는 지정된 시간을 기다릴 수 있으며, 자물쇠를 얻지 못하면false로 되돌아옵니다.시간 초과 설정을 제외하고 이 두 함수와try_lock 동작이 일치합니다.
    //  
    template 
        try_lock_for(const chrono::duration& rel_time);
    //  
    template 
        try_lock_until(const chrono::time_point& abs_time);
    

    try_lock_관련 코드
    #include 
    #include 
    #include 
    #include 
    
    void run500ms(std::timed_mutex &mutex) {
        auto _500ms = std::chrono::milliseconds(500);
        if (mutex.try_lock_for(_500ms)) {
            std::cout << " " << std::endl;
        } else {
            std::cout << " " << std::endl;
        }
    }
    int main() {
        std::timed_mutex mutex;
    
        mutex.lock();
        std::thread thread(run500ms, std::ref(mutex));
        thread.join();
        mutex.unlock();
    
        return 0;
    }
    // : 
    

    기타


    mutex 파일에 lock_guard, unique_lock,std::call_once, std::try_lock,std::lock(대량 잠금) 조작, 편폭 관계로 다음에 다시 이야기합시다.
    이전 C++11 다중 스레드(간단하지만 간단하지 않음)
    카탈로그
    다음 C++11 다중 스레드 - Mutex(2)

    좋은 웹페이지 즐겨찾기