2012-07-19 3 views
1

나는이 오늘과 같은 C# 코드의 조각을 건너 왔어요)에서 이 아닌은 작업 전에 해제되어야합니다 .Perform()을 호출합니까? 즉, 잠금을 유지하고있는 동일한 스레드에서 콜백 함수를 호출 할 수있는 방법이 있으며 해당 스레드가 잠금을 해제하기 전에 있습니까?스레드 안전

EDIT : messagingBus.Post (...)는 대기열에 삽입 된 것으로 간주되어 즉시 반환됩니다. 콜백은 다른 스레드, 아마도 스레드 풀에서 호출됩니다.

operation.Perform()의 경우 Thread.Sleep (10000)으로 읽을 수 있습니다. 오랫동안 실행되어 어떤 상태도 공유하거나 변형하지 않습니다.

+0

람다 식 또는'Post'가 비동기 인 경우 잠금이 해제 된 후에'Perform'가 호출 될 수 있습니다. – vcsjones

+0

@SamIam : 고정! – endian

+0

@vcsjones : 감사합니다. 그렇습니다. 제 질문은 반대입니다. Perform()가 실행되는 동안 잠금이 유지 될 수 있습니까? – endian

답변

0

나는 추측 할 것입니다.

Post in .net 일반적으로 작업이 다른 스레드 또는 다른 시간에 수행됨을 의미합니다.

그렇습니다. Perform이 호출되기 전에 obj의 잠금이 해제 될뿐만 아니라 가능성이 높습니다. 그러나 보장 할 수는 없습니다. 수행은 잠금이 해제되기 전에 완료 될 수 있습니다.

그렇다고 문제가있는 것은 아닙니다. "다양한 행동 수행"부분에는 자물쇠가 필요할 수 있습니다. messagingBus는 동작을 대기열에 넣기 위해 잠금이 필요할 수 있습니다. 내부의 작업은 잠금을 전혀 필요로하지 않을 수도 있습니다.이 경우 코드는 스레드로부터 안전합니다.

어떤 작업이 수행되는지, 왜 잠금 장치 안에 있어야하는지, 그리고 무엇이 Post 또는 수행하는지에 대한 개념이 없기 때문에 이것은 모두 추측입니다. 따라서 코드는 완벽하게 안전 할 수도 있고, 끔찍한 결함이있을 수도 있습니다.

0

messagingBus.Post가 어떤 작업을하고 있는지 알지 못하면 말할 수 없습니다. 포스트가 델리게이트를 호출하면 (예에서 람다 식) 주어진 람다가 실행되는 동안 잠금이 수행됩니다. 나중에 실행할 실행을 위임 한 스케줄을 게시하면 람다가 실행되는 동안 잠금은이되지 않습니다. lock (obj)이 무엇인지, MessagingBus.Post에 대한 호출을 잠그는 것, 또는 무엇이 ... 명확하지 않은가 ... messagingBus 변수의 유형 (전체 네임 스페이스 포함)을 상세화하면 더 자세한 정보를 제공하는 데 많은 도움이됩니다.

+0

@endian 자세한 정보를 제공 할 수 있습니까? –

0

콜백이 비동기 적으로 실행되면 예 (Post)가 특별한 경우를 피하기 위해 예외적으로 수행하지 않는 한 Perform()가 잠금을 유지할 수 있습니다.

Post()에 대한 호출과 동일한 스레드에서 콜백을 예약 한 경우 (예 : 스레드 풀의 스레드가 하나 인 극단적 인 예제) 일반 스레드 풀 구현은 스레드가 완료 될 때까지 콜백을 실행하지 않습니다 이 경우에는 Perform()를 실행하기 전에 잠금을 해제해야하는 현재 작업입니다.

0

messagingBus.Post가 구현되는 방법을 모른 채 질문에 대답하는 것은 불가능합니다. 비동기 API는 일반적으로 콜백이 실제로 동시에 실행된다는 보장을하지 않습니다. 예를 들어 FileStream.BeginRead와 같은 .Net APM 메서드는 동 기적으로 작업을 수행하기로 결정할 수 있습니다.이 경우 콜백은 BeginRead를 호출 한 동일한 스레드에서 실행됩니다. 이 경우 반환 된 IAsyncResult.CompletedSynchronously가 true로 설정됩니다.