> 백엔드 개발 > C++ > Boost를 사용하지 않고 C 0x에서 세마포어를 어떻게 구현할 수 있습니까?

Boost를 사용하지 않고 C 0x에서 세마포어를 어떻게 구현할 수 있습니까?

Barbara Streisand
풀어 주다: 2024-12-18 18:55:14
원래의
983명이 탐색했습니다.

How Can I Implement Semaphores in C  0x Without Using Boost?

세마포어 없는 C 0x의 동기화

C 0x는 원자 변수와 조건을 도입하지만 명시적인 세마포어 지원이 부족합니다. 이로 인해 Boost의 세마포어 구현을 사용하지 않고 스레드를 효과적으로 동기화하는 방법에 대한 우려가 제기되었습니다.

한 가지 방법은 뮤텍스와 조건 변수의 조합을 활용하여 맞춤형 세마포어를 생성하는 것입니다. 다음 예를 고려하십시오.

#include <mutex>
#include <condition_variable>

class semaphore {
    std::mutex mutex_;
    std::condition_variable condition_;
    unsigned long count_ = 0; // Initialized as locked.

public:
    void release() {
        std::lock_guard<decltype(mutex_)> lock(mutex_);
        ++count_;
        condition_.notify_one();
    }

    void acquire() {
        std::unique_lock<decltype(mutex_)> lock(mutex_);
        while (!count_) // Handle spurious wake-ups.
            condition_.wait(lock);
        --count_;
    }

    bool try_acquire() {
        std::lock_guard<decltype(mutex_)> lock(mutex_);
        if (count_) {
            --count_;
            return true;
        }
        return false;
    }
};
로그인 후 복사

이 구현은 뮤텍스(mutex_)를 활용하여 내부 데이터에 대한 액세스를 보호하고 조건 변수(condition_)를 사용하여 세마포어가 해제될 때 대기 중인 스레드에 신호를 보냅니다. count_ 멤버 변수는 0으로 초기화되어 초기에 잠긴 상태를 나타냅니다.

세마포어를 해제(즉, 획득 가능하게 만들기)하려면 release() 메서드가 개수를 증가시키고 대기 중인 스레드에 알립니다. 세마포어를 획득하기 위해 acquire() 메서드는 개수가 0이 아닐 때까지 기다립니다. try_acquire() 메서드는 비차단 방식으로 세마포를 획득하려고 시도하며 성공하면 true를 반환하고 그렇지 않으면 false를 반환합니다.

이 접근 방식은 Boost를 사용하지 않고 C 0x에서 세마포를 구현하는 간단하고 효율적인 방법을 제공합니다. 이는 스레드가 실행을 동기화하고 이벤트를 효과적으로 전달할 수 있도록 하는 POSIX 세마포와 기능이 유사합니다.

위 내용은 Boost를 사용하지 않고 C 0x에서 세마포어를 어떻게 구현할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿