2011-12-20 6 views
12

멀티 스레드 환경에서 잘 작동하는 Delphi에서 구현 된 우선 순위 큐를 찾고 있습니다.Delphi 용 스레드 안전 우선 순위 대기열?

이상적으로 잠금이 없거나 단일 스레드 구현 (이미 가지고있는) 주위에 잠긴 래퍼보다 나은 것으로 다중 스레드 삽입/삭제 용으로 설계되었습니다.

특이점은 최상위 (최상위 우선 순위 항목)이 변경 될 때 추가, 삭제 및 알림 만 발생하는 반면 최상위 우선 순위 항목의 "팝"작업은 매우 드문 경우입니다.

다른 스레드에서 실행되는 워치 독/타임 아웃 스레드 모니터링 작업에 사용되며, 대부분의 경우 정상적으로 종료 될 것으로 예상되므로 큐에 추가/제거됩니다. 타임 아웃 쓰레드는 본질적으로 다음 timeout 이벤트를 기다리고 있으므로 우선 순위가 가장 높은 이벤트가 변경 될 때 알림이 필요합니다.

작업은 언제든지 안전하게 종료 될 수있는 스크립트로 처리됩니다.

우선 순위 큐보다 더 나은 알고리즘이 있다면 좋은 답변 일 수도 있습니다!

편집 : 마틴 제임스 (Martin James)의 말에 따르면, 또 다른 특수성은 다른 타임 아웃 값이 상대적으로 적고 각 타임 아웃 값마다 FIFO 큐의 문제가된다는 것입니다.

+0

"단일 스레드 구현을 둘러싼 잠긴 래퍼"가이 작업에 적합하지 않은 이유는 무엇입니까? – Pol

+0

잠금 기반 솔루션을 적합하지 않게 만드는 성능 제약 조건은 무엇입니까? –

+0

@Pol : @Pol : 이미 게시물이 있기 때문에 충분하지 않습니다. –

답변

0

단일 대기열 대신 각 우선 순위에 대해 하나의 대기열을 사용할 수 있습니다. EZDSL의 델파이 XE 버전의 출시를 (발표 최근했습니다 http://code.google.com/p/omnithreadlibrary/

http://code.google.com/p/omnithreadlibrary/

+4

여러 단일 우선 순위 대기열은 실제로 해결책이 아닙니다. 모든 '터지는'작업은 엄청나게 복잡해집니다. (밀어 넣기, OTOH는 간단합니다.) 중간 계획에는 TODO가 "lock-free priority queue의 가능성을 확인하십시오."라고 말하고 있지만 앞으로 몇 달 안에 그런 일은 없을 것입니다. – gabr

1

Julian Bucknall ("알고리즘과 데이터 구조 델파이의 큰책"의 저자 :)

OmnithreadLibrary 스레드 안전 큐를 포함하는 Delphi Structures Library)를 Blog에 추가했습니다.

불행히도 TThreadsafePriorityQueue (EZDSLPQu.PAS에서 구현 됨)는 잠금 기반입니다.

좋은 소식을 전하는 데 도움이되지 않을 수 있으며 그 외의 의도는 질문에 대한 답변에 기여한 내용입니다.

+0

저는 개인적으로 이식 된 EZDSL을 영원히 사용하고 있습니다. 기초로 시작하는 것이 무엇이든 신뢰한다면 EZDSL입니다. –

1

내 프레임 워크 아키텍처는 완전히 우선 순위 스레드 대기열을 기반으로 구축되었습니다. 이것이 내가 사용하는 유일한 스레딩 모델입니다 (http://www.csinnovations.com/framework_overview.htm). 가파른 학습 곡선이지만, 아이디어를 줄 수도 있습니다.