2013-12-23 3 views
1

원자 잠금 변수를 사용하여 상호 배제를 구현하여 경쟁 조건을 감지하고 극복 할 수 있지만 상호 배제를 구현하지 않고 경쟁 조건을 감지 할 수있는 방법이 있습니까?상호 배제 구현하지 않고 경쟁 조건 감지

상호 배제는 오버 헤드를 크게 증가시킵니다. 따라서 추가적인 오버 헤드없이 경쟁 조건을 극복 할 수있는 방법을 생각하고있었습니다.

답변

1

동기화가 오버 헤드를 크게 늘릴 필요가 없습니다. 일반적으로 문제를 해결하기위한 비교적 저렴한 방법이 있습니다. 문제가 발생하는 경우 시나리오의 세부 정보와 게시자가 사용하는 동기화 기술을 게시하면 제안 사항을 제시 할 수 있습니다.

동기화의 필요성을 피한다면 실제로 좋은 방법은 없습니다. 동시 프로그래밍에서 다루어야 할 문제입니다. 많은 경우에 여러 스레드를 완전히 필요로하지 않아도되고, 다른 경우에는 가능한 한 스레드를 격리하고 몇 가지 중요 위치에 대한 동기화 필요성을 줄일 수 있습니다. 예를 들어, 많은 경우에 하나의 스레드가 모든 부기 및 데이터 액세스를 담당하는 메시지 스레드 개념을 사용하고 싶습니다. 그런 다음 작업자 스레드는 처리를 위해 동기화 된 대기열을 사용하여이 스레드에 메시지를 게시합니다. 이렇게하면 동기화 된 메시지 큐만 제공하면되고 다른 모든 작업은 독립적으로 진행될 수 있습니다.

희망이 도움이됩니다. 더 구체적인 아이디어/제안을 원하시면 좀 더 자세한 정보를 자유롭게 게시하십시오.

+0

"동기화 된 대기열"에 대한 언급이 더 잘 설명 될 수 있습니다. 메시지 대기열 예제에서 좋은 후보는 LinkedBlockingQueue입니다 - 동기화되지 않은 잠금을 사용합니다. 캐주얼 독자는 대기열 방법 내에서 "동기화"하려고한다고 믿을 것입니다. – javadba

+0

@javadba 좋은 설명, 감사합니다. C#에서는 ['Queue.Synchronized'] (http://msdn.microsoft.com/en-us/library/system.collections.queue.synchronized%28v=vs.110%29.aspx) getter를 사용하여 'Queue' 주위에 스레드 안전 래퍼를 생성하십시오. – TypeIA