C++11로 작성된 제한된 다중 생산자 다중 소비자 동시 대기열입니다.
전투가 강화되어 매일 생산에 사용됩니다.
다음 논문에서 인용되었습니다.
MPMCQueue< int > q ( 10 );
auto t1 = std::thread([&] {
int v;
q. pop (v);
std::cout << " t1 " << v << " n " ;
});
auto t2 = std::thread([&] {
int v;
q. pop (v);
std::cout << " t2 " << v << " n " ;
});
q.push( 1 );
q.push( 2 );
t1.join();
t2.join();
MPMCQueue<T>(size_t capacity);
용량이 capacity
인 T
유형의 항목을 보유하는 새로운 MPMCQueue
구성합니다.
void emplace(Args &&... args);
내부 구성을 사용하여 항목을 대기열에 넣습니다. 대기열이 가득 차면 차단됩니다.
bool try_emplace(Args &&... args);
내부 구성을 사용하여 항목을 대기열에 추가해 보십시오. 성공하면 true
반환하고 대기열이 가득 차면 false
반환합니다.
void push(const T &v);
복사 구성을 사용하여 항목을 대기열에 추가합니다. 대기열이 가득 차면 차단됩니다.
template <typename P> void push(P &&v);
이동 구성을 사용하여 항목을 대기열에 넣습니다. std::is_nothrow_constructible<T, P&&>::value == true
인 경우에만 오버로드 해결에 참여합니다. 대기열이 가득 차면 차단됩니다.
bool try_push(const T &v);
복사 구성을 사용하여 항목을 대기열에 추가해 보세요. 성공하면 true
반환하고 대기열이 가득 차면 false
반환합니다.
template <typename P> bool try_push(P &&v);
이동 구성을 사용하여 항목을 대기열에 추가해 보세요. std::is_nothrow_constructible<T, P&&>::value == true
인 경우에만 오버로드 해결에 참여합니다. 성공하면 true
반환하고 대기열이 가득 차면 false
반환합니다.
void pop(T &v);
항목을 v
로 복사하거나 이동하여 항목을 대기열에서 제거합니다. 대기열이 비어 있으면 차단됩니다.
bool try_pop(T &v);
항목을 v
로 복사하거나 이동하여 대기열에서 제거해 보세요. 성공하면 true
반환하고 대기열이 비어 있으면 false
반환합니다.
ssize_t size();
큐에 있는 요소의 수를 반환합니다.
대기열이 비어 있고 대기 중인 판독기가 하나 이상 있는 경우 크기는 음수가 될 수 있습니다. 이는 동시 대기열이므로 모든 판독기 및 기록기 스레드가 결합될 때까지 크기는 최선의 추측일 뿐입니다.
bool empty();
대기열이 비어 있으면 true를 반환합니다.
이는 동시 대기열이므로 모든 판독기 및 기록기 스레드가 조인될 때까지 최선의 추측일 뿐입니다.
생성 및 소멸을 제외한 모든 작업은 스레드로부터 안전합니다.
엔큐:
대기열에서 제거:
참고자료:
동시성 알고리즘을 테스트하는 것은 어렵습니다. 구현을 테스트하기 위해 두 가지 접근 방식을 사용하고 있습니다.
boost::lockfree::queue
및 기타 항목과 비교 static_assert
대신 C++20 개념을 사용하세요. std::hardware_destructive_interference_size
사용하세요. [[nodiscard]]
속성 추가 이 프로젝트는 Erik Rigtorp <[email protected]>에 의해 만들어졌습니다.