2013-08-27 4 views
1

저는 C/C++에서 lock-free 큐를 찾기 위해 꽤 많은 노력을 기울였습니다. 그러나 대부분 boost :: lockfree를 포함하여 최대 요소 수를 지정해야합니다.가변 길이 잠금없는 대기열?

가변 길이와 다중 생산자 및 다중 소비자 lockfree 대기열에 대한 정보를 누군가에게 줄 수 있습니까?

+0

전통적인 해결책은 Michael-Scott에 의해 기술되고 Orlarey-Fober-Letz에 의해 개선되었습니다. –

+0

이것은 이전에 물어 보았으며 여기에있는 응답 중 일부는 여전히 유효하고 유지 보수 된 것 같습니다 : [C++에서 프로덕션 준비가 된 lock-free 큐 또는 해시 구현이 있습니까?] (http://stackoverflow.com/questions/1164023/is) - 준비 - 준비 - 잠금 - 대기열 또는 해시 구현 -에서 - C) –

답변

2

최대 길이에 대한 가장 큰 이유는 큐가 생성되면, 당신은 (잠재적 new 또는 malloc 또는 무엇이든에 차단 새로운 객체를 만드는 데 사용하지 않고) 새로운 객체를 생성 할 수 있다는 것입니다.

확실한 해결책이 있는지 모르겠습니다. 할당 잠금이 허용되면 사용 가능한 메모리 양에 의해 제한되는 잠금없는 대기열을 만드는 것이 어렵지 않습니다.

boost::lockfree에는 대기열을 늘리는 데 사용할 수있는 reserve(n)reserve_unsafe(n)이 있습니다. 의견에 응답

편집 :

예, 진짜 문제는이 개 업체가 있기 때문에 어느 정도 또는 다른에서, 같은 시간에 새로운 요소를 추가하려고 할 때 시작, 메모리 할당이 될 때까지 차단됩니다 " leading "스레드는 할당을 완료했습니다. 물론 어떤 경우에는 허용 될 수 있지만 일반적으로 잠금없는 큐를 사용하는 이유는 잠금을 피하는 것이고 new 또는 malloc 내부의 잠금을 해제하는 것은 여전히 ​​잠금이 아닙니다.

비교적 드문 간격으로 만 발생하는 경우 큰 경우는 아닙니다 (유스 케이스에 따라 다름). 그러나 정기적으로 발생한다면 문제가 될 수 있습니다. 심지어 하나의 프로듀서

는이 "대기받는 추가 더"의 "대기"원인이 다른 스레드가 어딘가에 malloc 또는 new를 호출되지 않는다고 보장 할 수는 없습니다.

유일한 해결책은 가능한 작업 부하를 처리하기에 충분한 크기의 고정 크기 대기열을 만드는 것입니다. 큐 자체가 (스마트 한) 포인터/오브젝트에 대한 참조를 보유하고 있으면 실제로 큐에 저장된 오브젝트의 너 + 많은 메모리를 차지하지 않을 수 있습니다. 결국, 당신은 1000 요소를 저장하는 경우, 큐가 동적 또는 고정 크기 여부 스토리지의 가치가 적어도 1000 요소가 필요합니다.

+0

실제로 내가 동적 크기의 lockfree를 발견하지만, 그것은 단일 생산자, 단일 소비자입니다. [링크] (http://moodycamel.com/blog/2013/a-fast-lock-free-queue-for-c++) 요소의 수가 num 이상일 때 큐가 새로운 노드를 만들고 크기를 조정할 것입니다. – user2720721

+0

나는 부스트 문서를 다시 본다. "운영체제의 메모리 할당은 잠금이 없으므로 진정한 동적 크기의 비 차단 데이터 구조를 구현할 수 없습니다." 동적 크기의 대기열은 단일 생산자이므로 자체 크기를 조정할 수 있습니까? – user2720721

+0

@ user2720721 : 답변에서 편집 참조. –