2011-12-08 6 views
0

Google에서이 검색어로 두통을 느끼고 있습니다.삽입 우선 순위가있는 비 우선 순위 대기열

다음을 달성하려면 스레드 안전 메커니즘이 필요합니다. 삽입 우선 순위가 읽기보다 스레드 안전 목록입니다.

항상 큐에 메시지를 삽입 할 수 있어야하고 때로는 읽을 수 있어야합니다. 독서가 삽입을 방해 할 수는 없습니다.

감사합니다.

편집 : 읽기는 또한 빨간색 부분을 지우는 것을 의미합니다.

EDIT2 : 도움이 될지도 모르지만 단일 독자와 한 명의 작가가 유용 할 것입니다.

EDIT3 시나리오 시나리오 : 1 초 동안 10 초당 삽입 (또는 소프트웨어가 설치된 하드웨어를 사용하여 최대 가능). 그런 다음 1 분 동안 삽입을 일시 중지합니다. 그런 다음 30 초 동안 2 초 이내에 20 개의 인서트 (또는 소프트웨어가 설치된 하드웨어를 사용하여 최대 가능)를 수행하십시오. 그런 다음 30 초간 정지합니다. 그런 다음 최대 읽기 횟수 동안 일시 중지가 사용됩니다. 내가 충분히 명확한 지 모르겠다. 당연히 아니. (추신 : 일시 중지가 언제 생길지, 그게 문제인지). 최대 acc. insert for delay : Enqueue 나 Add 메소드가 끝나는 시간.

추가 : TryGetValue 및 TryRemove가있는 AddOrUpdate가있는 ConcurrentDictionary를 사용할 수 있습니까?

+0

제한이 없으면이 큐는 바인딩없이 확장되어 모든 메모리를 소모 할 수 있습니다.이 때 삽입 *은 실패하거나 대기해야합니다. 큐에있는 메시지의 수에 대한 실제 상한이 있습니까? –

+0

@sll 무엇을 편집하셨습니까? (나는 알았다, 태그) –

+0

@Damien_The_Unbeliever하지만, 여기서 중요한 부분은 삽입 우선 순위 다. 물리적으로 큐에 '너무 많은'메시지를 보낼 수 없습니다. –

답변

1

큐를 개체의 연결된 목록으로 구성하십시오. 대기열의 머리와 꼬리에 대한 참조를 유지합니다. 대략 당신이 읽기와 쓰기에 대한 별도의 잠금 장치를하고 대기열에 하나 entiry가없는 한 그들은 서로를 차단하지 않습니다 여기에 아이디어를

QueueEntity Head; 
QueueEntity Tail 

class QueueEntity 
{ 
     QueueEntity Prev; 
     QueueEntity Next; 
     ... //queue content; 
} 

and then do this: 

//Read 
lock(Tail) 
{ 
    //get the content 
    Tail=Tail.Prev; 
} 

//Write 
lock(Head) 
{ 
    newEntity = new QueueEntity(); 
    newEntity.Next = Head ; 
    Head.Prev = newEntity; 
    Head = newEntity; 
} 

을 알려주는 의사 코드 아래를 참조하십시오.

+0

재미있는 소리, 확인합니다. –