2012-02-28 2 views
3

질문에 상태에 따라 개체의 공유 메서드를 다중 스레드 할 수 있습니까? 나는 스킬 셋에 실을 꿰매고 있지 않다. 그렇지 않으면 나 자신을 테스트 할 것이다. 다른 한편으로, 나는 VB.Net에서 멀티 스레드 응용 프로그램의 일부가 될 수있는 클래스를 디자인하는 데 관여하고 있습니다.공유 메서드를 다중 스레드 할 수 있습니까?

+1

멀티 스레드 응용 프로그램의 일부가 될 수있는 클래스를 디자인하는 경우 스킬 셋에 스레딩을해야 할 때가 있습니까? – MarkJ

+0

예, 동의합니다. 당신이 관심있는 것을 배울 필요가있는 기회를 좋아합니다. 이런 기회가 있습니다 : –

답변

6

"한 번에 여러 스레드에서 공유 메서드를 호출하는 것이 안전합니까?"라는 대답은 "의존적"입니다. 메서드 자체는 다중 스레드 또는 단일 스레드가 아닙니다. 스레드와 메소드는 매우 별개의 것입니다.

공유 메서드가 여러 스레드에서 호출 된 경우 다른 말로는 동기화가 없으면 해당 스레드에서 동시에 실행됩니다. 메서드가 적절한 보호 장치없이 공유 상태를 사용하는 경우 문제가 발생할 수 있습니다. 그러나 공유 리소스에 액세스 할 때 (예 : 잠금 사용) 또는이 스레드간에 공유되는 상태에 액세스하지 않는 경우에는 문제가되지 않습니다.

+0

공유 상태를 알아두면 좋습니다. Jon Skeet에서 우리는 신뢰합니다. ;) –

3

예, 가능합니다. 모든 메소드는 스레드가 될 수 있습니다.

+0

같은 방법이 여러 스레드 경로에 있더라도? –

+0

@hydroparadise : 예. 그들은 별도로 처형 될 것입니다. – Ryan

1

예, 공유 메서드는 여러 스레드에서 동시에 실행할 수 있습니다. 실제로, 그들은 종종 있습니다. 인스턴스 메서드와 비교하여 공유 메서드를 실행하는 스레드를 많이 제어 할 수 없습니다. 예를 들어 ASP.NET 응용 프로그램을 생각해보십시오. 다른 페이지 요청이 다른 스레드에서 올 수 있습니다. 웹 애플리케이션에서 공유 메소드를 호출하면 다중 스레드에 의해 실행될 확률이 높습니다.

이것은 API를 설계 할 때 매우 중요합니다. 모든 자존심을 가진 API 작성자는 모든 공유/정적 메소드가 스레드로부터 안전한지 확인하기 위해 극단적 인 방법을 사용합니다. 어쨌든, API를 호출 한 사람이 제공하는 모든 공유/정적 메소드에 대한 액세스를 동기화하도록 만드는 것은 엄청나게 부담 스러울 것입니다. Microsoft가 BCL의 거의 모든 클래스에 제공하는 설명서를 살펴보십시오.

이 형식의 모든 공용 static (Visual Basic의 경우 Shared) 멤버는 스레드로부터 안전합니다. 모든 인스턴스 구성원은 스레드 안전성을 보장하지 않습니다.

스레드로부터 안전하지 않은 Microsoft에서 제공하는 정적 메서드를 아직 실행하지 않았습니다. 1 그리고 당신은 알려 주시기 하나 알고 있다면 그것은 I.


1을 당신을 위해 쉽게 생활을하고 있기 때문 좋다.

관련 문제