>  기사  >  백엔드 개발  >  C++ 다중 스레드 프로그래밍에서 읽기-쓰기 잠금의 목적은 무엇입니까?

C++ 다중 스레드 프로그래밍에서 읽기-쓰기 잠금의 목적은 무엇입니까?

WBOY
WBOY원래의
2024-06-03 11:16:57761검색

멀티스레딩에서 읽기-쓰기 잠금을 사용하면 여러 스레드가 동시에 데이터를 읽을 수 있지만 동시성과 데이터 일관성을 향상시키기 위해 하나의 스레드만 데이터를 쓸 수 있습니다. C++의 std::shared_mutex 클래스는 다음 멤버 함수를 제공합니다. lock(): 쓰기 액세스를 얻고, 읽기 또는 쓰기 잠금을 보유한 다른 스레드가 없으면 성공합니다. lock_read(): 다른 읽기 잠금이나 쓰기 잠금과 동시에 보유할 수 있는 읽기 액세스 권한을 얻습니다. Unlock(): 쓰기 액세스를 해제합니다. Unlock_shared(): 읽기 액세스를 해제합니다.

C++ 多线程编程中读写锁的用途是什么?

C++ 다중 스레드 프로그래밍에서 읽기-쓰기 잠금 사용

개요

멀티 스레드 프로그래밍에서 읽기-쓰기 잠금은 여러 스레드가 공유 데이터를 읽을 수 있도록 허용하는 동기화 메커니즘입니다. 그러나 하나의 스레드만 공유 데이터에 쓸 수 있습니다. 이는 데이터 일관성을 보장하면서 동시성을 향상시키는 데 도움이 됩니다.

Implementation

C++의 std::shared_mutex 클래스는 읽기-쓰기 잠금을 구현합니다. 다음과 같은 멤버 함수를 제공합니다: std::shared_mutex 类实现了读写锁。它提供以下成员函数:

  • lock(): 获取锁定的写入访问权限。只有当没有其他线程持有读取或写入锁时,此函数才成功。
  • lock_read(): 获取锁定的读取访问权限。可以与其他读取锁或写入锁同时持有。
  • unlock(): 释放锁定的写入访问权限。
  • unlock_shared()
    • lock(): 잠금에 대한 쓰기 액세스 권한을 얻습니다. 이 함수는 읽기 또는 쓰기 잠금을 보유한 다른 스레드가 없는 경우에만 성공합니다.
    • lock_read(): 잠금에 대한 읽기 액세스 권한을 얻습니다. 다른 읽기 또는 쓰기 잠금과 동시에 보유할 수 있습니다.
  • unlock(): 잠긴 쓰기 액세스를 해제합니다.

  • unlock_shared(): 잠금에 대한 읽기 액세스를 해제합니다.

    사용 예

    공유 변수를 보호하기 위해 읽기-쓰기 잠금을 사용하는 다음 코드를 고려하세요.

    #include <iostream>
    #include <shared_mutex>
    
    std::shared_mutex m;
    int shared_var = 0;
    
    void reader() {
        m.lock_read();
        std::cout << "Reading: " << shared_var << '\n';
        m.unlock_shared();
    }
    
    void writer() {
        m.lock();
        std::cout << "Writing: " << ++shared_var << '\n';
        m.unlock();
    }
    
    int main() {
        std::thread t1(reader);
        std::thread t2(writer);
        std::thread t3(reader);
        t1.join();
        t2.join();
        t3.join();
    }

    🎜출력: 🎜🎜
    Reading: 0
    Writing: 1
    Reading: 1

위 내용은 C++ 다중 스레드 프로그래밍에서 읽기-쓰기 잠금의 목적은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.