2012-07-06 3 views
1

디자인 및 C++ 구현에 대한 조언이 필요합니다 (저는 C++을 처음 접하는 자바 사람입니다).목록에있는 다른 배우 2 명을 추가하는 방법에 대한 조언

나는 프로세스 목록을 가지고 있습니다. 한 스레드가 목록에 추가/제거 프로세스를 실행하고 두 번째 스레드가 10ms에 한 번 실행되고 시간이 초과 된 프로세스를 모두 수집 (목록에서 제거)합니다. 각 프로세스에는 목록에 추가 될 때 생성 타임 스탬프가 있습니다. 3 초가 경과하고 프로세스가 여전히 목록에 있으면 (첫 번째 스레드에서 제거되지 않은 경우) 프로세스는 클리너 프로세스에 의해 목록에서 제거됩니다.

낮은 오버 헤드가 있어야합니다. 추가, 제거, 깨끗한 추가/removeById하고 깨끗한 사이에 동기화 할

필요 :

그래서 나는 3 가지 방법으로 processListContainer 있습니다. 청소할 때 새 목록을 만드는 것과 같은 영리한 사고로 수행 할 수 있으며 여러 목록을 처리 할 수 ​​있습니다.

목록의 크기는 약 100K와 당신은 하나 개의 목록을 유지하고, 뮤텍스로 보호 할 필요가 초

+0

항상 '추가'가 꼬리에 있고, 항상 머리에서'제거 '됩니까? – jxh

+0

추가 및 제거는 동일한 스레드에 의해 수행됩니다. 내가 어디에 추가 해야할지 궁금해. 제거는 꼬리 또는 머리에서 dosnt이다. 이 스레드는 요소 id-x를 제거하라는 요청을받을 수 있으며 제거해야합니다. –

답변

1

프로세스 목록을 하위 목록으로 구성 할 수 있습니다. 각 하위 목록은 동일한 5ms 간격 내에 만료되는 프로세스 모음입니다. 이렇게하면 개별 프로세스를 반복하는 대신 부실한 프로세스를 제거하기로 결정할 때 cleaner 스레드가 전체 하위 목록을 지울 수 있습니다.

목록에 처음에는 빈 하위 목록이 있습니다.

clean 작업은 종료 조건이 헤드 하위 목록이 비어 있거나 헤드 하위 목록이 만료되지 않는 루프입니다. 만료 된 헤드 하위 목록은 목록을 지 웁니다. 목록에 두 개 이상의 하위 목록이 있으면 결과로 나오는 빈 하위 목록이 제거됩니다. 루프가 반복됩니다.

따라서 add은 프로세스가 마지막 하위 목록에 속하는지 확인합니다. 그렇다면 하위 목록에 추가됩니다. 그렇지 않은 경우 새 하위 목록을 만들고 하위 목록을 추가하고 목록에 하위 목록을 추가합니다.

remove 요소는 제공된 요소를 하위 목록에서 제거합니다. 하위 목록이 비어 있고 목록에 둘 이상의 하위 목록이 있으면 빈 하위 목록을 제거합니다.

이 구성표에서 add은 꼬리 나 유망하지 않은 하위 목록 만 조작하기 때문에 잠글 필요가 없습니다. cleanremove은 둘 다 목록의 헤드를 조작 할 수 있기 때문에 잠금이 필요합니다.

+0

저는 개념이 마음에 들지만 잠금을 피하기 위해서는 손으로 만들어진 구조가 필요합니다. –

+0

remove는 id에 의해 수행되며 동일한 add thread에 의해 수행됩니다. –

+0

@MatthieuM .: 이것은 아마도 사용자 지정 데이터 구조 일 것입니다. – jxh

0

에 추가 수천이다. 또한 나는 'cleaner'프로세스를 피하고 프로세스가 완료 될 때 목록에서 자신을 제거해야합니다.

+0

목록이 거대합니다 (100K). 따라서 모든 요소의 타이머가 매우 비쌉니다. –

관련 문제