세마포 없는 C 0x: 스레드 동기화 달성
C 0x는 다양한 개선 사항을 도입했지만 주목할만한 누락 중 하나는 세마포가 포함되어 있다는 점입니다. 세마포어는 스레드 동기화에 필수적이며 스레드가 이벤트에 신호를 보내고 완료될 때까지 기다릴 수 있도록 해줍니다.
문제 설명
세마포가 없는 경우 메커니즘을 어떻게 구현할 수 있습니까? 다음 POSIX 세마포어에 예시된 것처럼 스레드 동기화를 위해 사용법:
void thread0(...) { doSomething0(); event1.wait(); ... } void thread1(...) { doSomething1(); event1.post(); ... }
뮤텍스와 조건 변수를 사용한 솔루션
효과적인 방법 중 하나는 뮤텍스와 조건 변수를 사용하여 세마포어와 유사한 기능을 만드는 것입니다. 코드는 다음과 같습니다.
#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; } };
사용법
이 사용자 정의 세마포어는 다음과 같은 방식으로 사용할 수 있습니다.
semaphore event1; void thread0(...) { doSomething0(); event1.acquire(); ... } void thread1(...) { doSomething1(); event1.release(); ... }
비교 Mutex Only
이 접근 방식 뮤텍스만 사용할 때보다 여러 가지 장점이 있습니다.
이 사용자 정의 세마포어 구현을 활용하면 명시적인 세마포어 지원 없이 C 0x에서 스레드 동기화를 효과적으로 달성할 수 있습니다.
위 내용은 세마포어를 사용하지 않고 C 0x에서 스레드 동기화를 어떻게 달성할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!