2014-11-05 2 views
0

고도로 평행 한 deque의 구현 (부스트 또는 다른 방법)이 있습니까? 병렬로, 예를 들어 전달 된 모든 항목을 제거, 즉고도로 평행 한 deque

parallel.for(deque.erase, list<locations>); 

: 특히,이 (의사) 같은 말을 할 수있게하려면 deque의 위치 목록입니다. 동시에이 작업으로이 삭제/삽입과 관련이없는 다른 삭제 또는 삽입을 차단하지 않아야합니다.

예를 들어, 스레드 1은 1,3,7,9 번 위치의 항목을 삭제할 수 있습니다 (병렬 삽입은 양키지로 삽입됩니다 (병렬 삽입은 push_back 일 수 있으며 삽입하려고 시도하지 않는 한 쉬운 것처럼 보입니다). 오래된 쓰레기 위치), 쓰레드 3은 (병렬 쓰레기) 위치 2,4,8을 삭제할 수 있습니다. [다른 쓰레드 삭제는 결코 지우기 위치와 교차하지 않습니다.] 이미 지워진 위치를 지우려고하면 (센티널 값 유지) 오류입니다. 즉, 위치가 고정 될 때까지 위치가 고정된다는 의미입니다 (잠금이 필요합니다). 지워진 위치는 내 스레드에 삽입 할 수있는 다른 스레드에 대한 감시 값을 보유 할 수 있습니다. 따라서 인터페이스는 push_back이 아니고 push_available 일 수 있습니다.

큰 소리로 생각해 보면, 이 조각화되어 자라기 때문에 push_backs가 지워진 값 (?)을 채우지는 않지만 일부 종류의 압축이 결국 가능할 것으로 생각됩니다.

paralell_deque는 잠금을 제거 할 때까지 삽입이나 삭제가 허용되지 않는 곳에서도 잠금을 허용해야합니다. 예를 들어, 큐의 상태 (내용)를 인쇄 할 때 ...

deque는 구현을위한 여러 가지 전략을 가질 수 있으며 일부는 이러한 병렬 처리에 대해 다른 규칙보다 더 적합 할 수 있습니다.

나는 또한이 질문이 너무 모호하고 재미있는 대답이 주어지기 전에 격추 당할 수도 있음을 알고 있습니다.

+3

나는 "deque"라는 단어를 조금 사용하여 혼란스러워합니다. 일반적으로,이 데이터 구조는 무작위로 삽입 및 삭제를 지원하지는 않지만 양쪽 끝에서만 지원됩니다. 이중 연결된 목록을 찾고 있습니까? [Boost.Lockfree] (http://www.boost.org/doc/libs/1_57_0/doc/html/lockfree.html)에는 몇 가지 잠금없는 데이터 구조가 있지만 실제로 필요한 작업을 알지 못해도 그들 중 누구라도 (아마도 조합으로) 귀하의 필요에 부응 할 수 있는지 말하십시오. – 5gon12eder

+0

이 질문은 임의의 위치에서 더하거나 뺄 때 일반적으로 대기열에서 빼기를 원하지 않기 때문에 조금 이상합니다. 목록을 원합니다. 이 질문은 [XY 문제] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)와 비슷합니다. [병렬 대기열 구현] (https://www.justsoftwaresolutions.co.uk/threading/implementing-a-thread-safe-queue-using-condition-variables.html)이지만 실제로는 작동하지 않습니다. 너는 설명하고있다. – QuestionC

+0

@QuestionC 당신이 수정하기 위해 큐 블록에서 특별히 다른 모든 작업을 수행하도록 링크하는 큐 – sehe

답변

2

노드 기반 컨테이너 (iterator를 무효로하지는 않지만)가 연속 된 저장소를 원한다고 들리는 것 같습니다.

나는 Boost Interrusive를 사용하여 연속적으로 저장된 요소 위에 링크드 목록을 구성하는 것이 좋습니다.

그러나 그 전에는 내가 생각할 수있는 가장 단순한 데이터 구조로 살고 있습니다. 정확히 원하는 이유와 이유를 알고 있어야합니다.