문제

이 있 thread-safe,non-blocking 큐 클래스에서는 C++?

아마도 기본적인 질문은 하지만 나는 일을 하지 않은 C++for a long time...

편집: 제 STL 요구 사항입니다.

도움이 되었습니까?

해결책

가정신 CPU 에는 두 배-포인터를 넓은 compare-and-swap(compxchg8b 에 486 이상,compxchg16b 에서 가장 amd64 기계[지 않는 현재에 일부 이른 모델에 의해 Intel])...있는 알고리즘 .

업데이트:그것은 어렵지 않을 번역하는 C++는 경우에 당신은 두려워하지 않는 비트를하고 있습니다.P

이 알고리즘에서"포인터와 태그"구조는 다음과 같습니다:

// Be aware that copying this structure has to be done atomically...

template <class T>
struct pointer
{
   T *ptr;
   uintptr_t tag;
};

당신을 감싸 지침 lock cmpxchg{8|16}b 일부 인라인 asm...

어쩌면 다음 작성할 수 있습니다 큐 노드의 다음과 같다:

template <class T>
struct queue_node
{
    T value;
    pointer<queue_node<T> > next;
};

나머지 부분은 더 많거나 적은 전송 알고리즘 제가 연결되...

다른 팁

현재 C ++ 표준은 스레드의 존재를 인정하지 않기 때문에 STL 또는 표준 라이브러리의 다른 부분에는 스레드 안전이 가장 확실하지 않습니다.

이것은 작년 Dobb 박사의 인기있는 주제 인 것 같습니다.

직접 구현하거나 구현하는 라이브러리를 사용해야합니다. 직접하려면 이것을보고 싶을 수도 있습니다.

조건 변수를 사용하여 스레드 안전 큐를 구현합니다

짧은 대답 - 아니오. STL은 동시성 (적어도 사양 수준에서)과 관련이 없습니다. 현재 C ++ 표준은 스레드에 대해 아무 말도하지 않습니다.

STL 위에 이러한 대기열을 쉽게 만들 수 있고 부스트 할 수 있습니다. std::queue 그리고 boost::mutex 사용자 정의 클래스에서.

STL 컨테이너는 스레드 안전하지 않으므로 동시 액세스를 위해 치료를 구현해야합니다.
동시 액세스를 제공하는 것을 목표로하는이 프로젝트 (C ++)가 있습니다. CPH STL
그리고 종이.

지금 너무 늦을 수 있습니다. 향후 참조를 위해이 제품은 잠금없는 대기열 (일부 경고가있는 스레드 안전을 내장)을 잘 구현 한 것입니다.

멀티 생산자 - 다중 소비자

http://moodycamel.com/blog/2014/a-fast-general-purpose-free-queue-for-c+

https://github.com/cameron314/concurrentqueue

단일 생산자 - 단일 소비자

http://moodycamel.com/blog/2013/a-fast-lock-free-queue-for-c++

https://github.com/cameron314/readerwriterqueue

현재 비공식적입니다 boost.lockfree 고려해야 할 사항입니다. 나는 FIFO와 원자 유형을 모두 사용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top