2013-08-06 2 views
2

이전에 동시 스레드로 거의 경험하지 못했기 때문에 여기서 약간의 도움이 필요합니다.다중 스레드 쓰기, 대기열에서 읽는 하나의 스레드, 스레드 안전성

기본적으로 내가 가지고있는 것은 대기열 (DI 프레임 워크 또는 정적 개체에 의해 싱글 톤으로 관리되는지 여부)입니다. 나는 또한 그 큐에 쓸 필요가있는 다중 쓰레드를 가지고 있지만, 단지 하나의 쓰레드는 큐를 빼낼 것이다.

스레드 안전성에 대한 약간의 경험 부족으로 인해 실수로 오류가 발생하지 않도록 특정 작업을 수행해야합니까? 요구 사항 중 하나는 대기열에있는 객체가 정확한 순서로 대기하고 있다는 것을 고려하면 처음에는 대기열에있는 클래스에 전송됩니다.

나는 ConcurrentQueue를 사용해야하는 것이 필수적이라고 생각합니까? 아니면 대기열에 잠겨서 잠글 때 내 마법을 시작해야합니까?

+0

ConcurrentQueue 또는 BlockingCollection. –

답변

0

ConcurrentQueue을 사용하는 경우 대기열 작업과 관련된 추가 작업은별로 없습니다. 당신이 정말로 강요 당하지 않는 한 당신 자신을 굴리지 말라. 멀티 쓰레딩은 이다. 디버깅은 재미 없어.

여러 작성자가있는 경우 엄격한 데이터 순서가 삽입되지 않아도됩니다. 즉, 하나의 스레드가 "A"를 추가하려고 시도하고 하나의 스레드가 "B"를 추가하려고 시도하면 명령 그들은 타이밍에 약간의 변화 만 있어도 결국 달라질 수 있습니다.

+0

좋아요, 여기가 흥미로워지기 시작합니다. 두 가지를 모두 매우 특정한 순서로 삽입해야합니다 (최소 밀리 초 정밀도). 그것에 가능한 해결책? – NeroS

+0

@ NeroS 그게 어떤 semi 진보 된 syncronisation을 필요로 할 것입니다 (즉, 쓰레드는 _tharted before_가 삽입을 완료 할 때까지 삽입물을 기다릴 필요가 있습니다.) [reactive extensions] (http://msdn.microsoft.com/en-us/) /data/gg577609.aspx)의 스케줄러에는 문제 해결을 위해 다소 모자라는 솔루션이있을 수 있습니다. 그렇지 않으면 해결하기가 다소 복잡 할 수 있습니다. –

+0

@NeroS - 요구 사항을 없애시겠습니까? 왜 당신은 데스크탑 OS에서 어떤 종류의 안정적인 방법으로도 얻을 수 없으므로 '최소 밀리 초 정밀도'가 필요하다고 말하는 이유는 무엇입니까? –

0

ConcurrentQueue는 좋은 시작이며 아마도 작동시키기 위해 알아 두어야 할 모든 것입니다. 잠금이 필요하거나 특수한 동시 클래스를 사용해야하는 스레드간에 공유 될 수있는 다른 리소스가 있는지 조심하십시오.