예.
struct counting_sem {
counting_sem(std::ptrdiff_t init=0):count(init) {}
// remove in C++17:
counting_sem(counting_sem&& src) {
auto l = src.lock(); // maybe drop, as src is supposed to be dead
count = src.count;
}
counting_sem& operator=(counting_sem&& src) = delete;
void take(std::size_t N=1) {
if (N==0) return;
auto l = lock();
cv.wait(l, [&]{
if (count > 0 && count < (std::ptrdiff_t)N) {
N -= count;
count = 0;
} else if (count >= (std::ptrdiff_t)N) {
count -= N;
N = 0;
}
return N == 0;
});
}
void give(std::size_t N=1) {
if (N==0) return;
{
auto l = lock();
count += N;
}
cv.notify_all();
}
// reduce the count without waiting for it
void reduce(std::size_t N=1) {
if (N==0) return;
auto l = lock();
count -= N;
}
private:
std::mutex m;
std::condition_variable cv;
std::ptrdiff_t count;
auto lock() {
return std::unique_lock<std::mutex>(m);
}
auto unlocked() {
return std::unique_lock<std::mutex>(m, std::defer_lock_t{});
}
};
코드는 테스트되지 않았거나 컴파일되었지만 사운드는 디자인되었습니다.
take(7)
은 for(repeat 7 times) take()
과 같지 않습니다. 대신 충분하지 않은 경우 차단할 수있는만큼 걸립니다. 정도가 될 때까지 아무것도하지 않도록
이
수정은 간단합니다 : 당신은 왜 세마포어와 같은 개체를 찾고 있습니다
if (count >= (std::ptrdiff_t)N) {
count -= N;
N = 0;
}
? 위의 텍스트를 읽으면 단일 코어 머신 용 프로그램을 빌드해야한다는 요구 사항이있을 수 있으며 해당 세마포어 메커니즘을 사용하고 싶거나 OS 세마포어 주위에 래퍼를 사용하는 정말 오래된 코드가 있다는 생각을하게됩니다. 행동. 좀 가까이 있니? – AhiyaHiya
@AhiyaHiya : 개인 학습을위한 학업 적 연습입니다. 재미있는 코드를 작성 중이며 posix 기반 동기화 메커니즘 (pthread_mutex_t, sem_t)에서 C++ 11 기본 메커니즘으로 마이그레이션하려고합니다. 나는 C++ 11이'std :: mutex'를 제공하는 것을 보았는데, 왜 세마포어가 없는지 의아해했다. 추가 읽기에서는'std :: condition_variable'이 세미 - 세마포어 기능을 구현하는 데 사용된다는 것을 알았지 만 그 기능과 한계를 배우고 이해하려고합니다. 세마포어와 완전히 일치하지는 않지만 아직 잘 모르겠습니다 ... 여전히 공부하고 있습니다. – StoneThrow
잘 공부 한 멀티 코어 동시/병렬 프로그래밍 가이드를보고 공부하고 싶다면 "효과적인 동시성"시리즈에서 허브 셔터의 병행 프로그래밍의 기둥을 검토해야합니다. https://herbsutter.com/category/effective -concurrency/ – AhiyaHiya