2010-12-07 7 views
2

안녕하세요, 스레딩을 어느 정도 필요로하는 프로그램을 리팩토링하는 중입니다. 그러나, 나는 스레딩에 대한 많은 사전 경험이 없으므로 여기에 도움이 필요한 간단한 질문이 있습니다.Thread Lock 객체가 필요합니까?

프로그램은 특정 파일 (각 관찰자는 다른 스레드에서 실행 됨)을 감시하고 변경 사항이 감지되면 Notify() 메서드 호출을 호출합니다. Notify() 메서드는 단순히 전자 메일을 보냅니다.

두 개 이상의 스레드가 동시에 변경을 감지하고 Notify()을 동시에 호출하는 경우 문제가됩니까?

Notify()은 여러 번 열리지 않는 파일에 액세스하지 않으므로 동시에 여러 스레드가 Notify()을 호출하면 문제가 발생하지 않습니다. 그러나 나는 틀릴 수 있습니다.

내가 잘못하면 Notify()으로 전화하기 전에 개체를 만들고 Lock(object)을 사용하는 것이 가장 좋은 방법입니까? 여러 스레드가 액세스해야하는 경우

+0

둘 다 동일한 개체를 사용하여 전자 메일을 보내는 경우 메일 보내기 개체가 여러 송신 작업의 스레드 안전성을 보장하는지 여부에 따라 잠글 필요가 있습니다. 별도의 객체가 있고 독립적으로 작동 할 수있는 경우 (전송 작업을 수행하기 위해 내부적으로 일부 공유 상태에 의존하지 않음) 잠글 필요가 없습니다. –

답변

2

잠금이 필요합니다 상태 (정적 또는 비 정적)은 그들 중 일부는을 변경하려고 공유. 그들이하는 일이 모두 일 경우이라고 읽습니다. 안전에 액세스 할 수 있습니다. 또한 공유 상태가 없다면 괜찮습니다.

+0

내가 생각한 것. 확인해 주셔서 감사합니다. – xbonez

+0

코드를 자세히 살펴보면 전자 메일 보내기가 텍스트 파일에 기록된다는 것을 알았습니다. 잠금 장치가 있어야 할 것 같네요 – xbonez

+0

예, 파일 열기, 쓰기 및 닫기를 수행하는 클래스에서 수행해야합니다. NLog 또는 Log4Net을 사용하는 경우 이미 스레드로부터 안전합니다. – Aliostad

2

알림 메소드가 공유 리소스 (예 : Notify() 메소드에서 사용하는 정적 변수)를 사용하는 경우 일부 스레드 문제가있을 수 있으며 잠금이 필요할 수 있습니다. 그렇지 않으면 문제가 발생하지 않습니다.

2

잠금을 수행해야하는 유일한 이유는 Notify() 안에 여러 변수가 동시에 변경되어 Notify()이 실행될 수있는 변수가있는 경우입니다.

그럼 재 감지를 막기 위해 감지 된 파일이 List<>이고, Notify() 메서드는 감지 한 파일을 List<>에 추가한다고 가정 해 보겠습니다. Notify()의 여러 인스턴스가 동시에 해당 목록에 액세스하려고 시도 할 수 있으며,이 경우 List<>을 잠그거나 다른 방식으로 동기화하는 것이 좋습니다.

당신이 묘사 한 바에 따르면, 나는 그것에 대해 걱정할 필요가 없다고 생각합니다.