차단하지 않는 스레드에 안전 큐에서는 C++?
-
10-07-2019 - |
문제
이 있 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
사용자 정의 클래스에서.
지금 너무 늦을 수 있습니다. 향후 참조를 위해이 제품은 잠금없는 대기열 (일부 경고가있는 스레드 안전을 내장)을 잘 구현 한 것입니다.
멀티 생산자 - 다중 소비자
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++
현재 비공식적입니다 boost.lockfree 고려해야 할 사항입니다. 나는 FIFO와 원자 유형을 모두 사용합니다.