아마 c# 5.0기준


목표)

쓰레드lock 걸때마다 밖에다가 readonly object mLock = new object(); 같은거 같다두기 싫다.


연구1)

캡쳐를 발생시키지 않을경우에, 람다는 코드위치에 대응하는 컴파일단에서의 const 같은 객체가 될수있음.

같은 형태의 람다를 서로다른 위치에서 작성할경우 서로 다른 객체로 인식하지만,

람다를 작성후 반환하는 함수를 중복해 사용할 시, 정적이고 전역적인 동일 객체가 반환되게됨

이는 lock의 파라미터로 람다 델리게이트를 집어넣어보면 알수 있음. ex) lock((Action)(()=>{})) (전역적인 쓰레드lock이 발생함.)


연구2)

A- 매서드를 델리게이트에 할당할경우, 변환과정에서 계속 새로운 객체를 생성함. (가비지가 생김)
B- 캡쳐가 발생하는 클로저식을 작성해도 실행될때마다 계속 새로운 객체가 생성됨. (가비지가 생김)

하지만 같은매서드를 할당한 델리게이트끼리 해싱비교시 논리적으로 동일한 것으로 인식되도록 구현되어있음.

지역변수를 캡쳐한 클로저와 다르게 this만 캡쳐한 동일코드위치의 클로저끼리도 논리적으로 동일한 것으로 인식되는것을 확인함,

this만 캡쳐하는것이 근본적인 조건인지, 아니면 더 근본적인 조건이 있는지는 잘 모르겠음.

문제는 A,B 경우 모두 HashSet, event delegate 등에서는 중복객체임을 인식하지만

lock에서 참조객체 파라미터로 사용시에는 서로다른 메모리위치에 있음이 들통남. (기대한 쓰레드 lock이 걸리지 않음.)


결과)

전역 함수에서 별도의 lock object를 선언할필요없이 lock((Action)(()=>{})) 과같은 패턴으로 단 한스택에 국소적인 쓰레드락을 표현하는데 성공함.

하지만 연구2 와같은 문제로 객체별로 독립적이게 까지 만드는데는 실패함.


문제점 틀린점 등 딴지 환영