이것은 C#의 세부적인 질문입니다.get/set을 통한 C# 스레드 안전
내가 객체와 클래스를 가지고 가정, 그 객체는 잠금 장치에 의해 보호됩니다 :
Object mLock = new Object();
MyObject property;
public MyObject MyProperty {
get {
return property;
}
set {
property = value;
}
}
내가 폴링 스레드가 해당 속성을 쿼리 할 수 있어야합니다. 또한 스레드가 가끔씩 해당 객체의 속성을 업데이트하고 사용자가 해당 속성을 업데이트 할 수 있으며 사용자가 해당 속성을 볼 수 있기를 원할 때도 있습니다.
다음 코드가 데이터를 제대로 잠글 것입니까? 나는 업데이트를 할 때
MyProperty.Field1 = 2;
이든, 필드가 잠 깁니다을 호출 할 경우
'제대로'으로Object mLock = new Object();
MyObject property;
public MyObject MyProperty {
get {
lock (mLock){
return property;
}
}
set {
lock (mLock){
property = value;
}
}
}
, 내 말은 무엇입니까? 'get'함수의 범위 내에서 equals 연산자로 수행되는 설정입니까, 아니면 'get'함수 (따라서 잠금)가 먼저 완료되고 설정이 끝난 다음 'set'이 호출되어 바이 패스됩니다. 자물쇠?
편집 : 이것은 분명히 트릭을 수행하지 않으므로, 무엇을 할 예정입니까? 내가 좋아하는 뭔가를 어떻게해야합니까 : 더 많거나 적은 그냥 내가 가지고있는 것 인 경우에 두 개의 스레드가 동시에 '수'를 호출 즉, 난 단지 사본에 액세스 할 수 있는지 확인합니다
Object mLock = new Object();
MyObject property;
public MyObject MyProperty {
get {
MyObject tmp = null;
lock (mLock){
tmp = property.Clone();
}
return tmp;
}
set {
lock (mLock){
property = value;
}
}
}
을, 그들은 각각 Field1과 같은 값으로 시작합니다 (맞습니까?). 거기에 읽을 수있는 방법과 속성을 읽을 때 잠금을 쓰기 이해가 되니? 아니면 데이터 그 자체가 아닌 함수 섹션을 잠그는 것에 전념해야합니까?
이 예제가 의미가 있습니다. MyObject는 상태를 비동기 적으로 반환하는 장치 드라이버입니다. 직렬 포트를 통해 명령을 보내면 장치가 자신의 달콤한 시간에 해당 명령에 응답합니다. 지금 당장은 상태에 대해 폴링하는 스레드가 있습니다 ("아직 명령 있습니까?"), 직렬 포트에서 응답을 기다리는 스레드 ("상태 문자열 2, 모든 것이 모두 양호 함") 그리고 다른 명령 ("사용자가이 일을하기를 원합니다.")을 취하는 UI 스레드와 드라이버의 응답을 게시합니다 ("방금 작업을 완료했습니다. 이제 UI를 업데이트합니다"). 그래서 개체의 필드보다는 개체 자체를 잠그고 싶습니다. 그것은 엄청난 수의 잠금 장치, a, b가 될 것입니다.이 클래스의 모든 장치가 동일한 동작을하는 것은 아니며 일반 동작이므로 잠금을 개별화하면 개별 대화 상자를 많이 코딩해야합니다.
동의. 싱글 톤 질문에 대한 응답으로 묻는 샘플 솔루션을 제공했습니다. http://stackoverflow.com/questions/7095/is-the-c-static-constructor-thread-safe/7105#7105 – Zooba
예, 당신이 기술 한 것처럼 객체를 잠그는 것이 좋습니다. 감사. – mmr
좋은 점은, 그가'p'라는 이름의'MyProperty'를 가지고 있고 동시에 두 개의 스레드를 호출했다면'p = new MyObject (12)'와'p = new MyObject (5)'입니다. 그러면 * this * . 그러나'Field1' 멤버는 잠기지 않습니다. 나는 이것이 당신이 말하고있는 것임을 확신합니다. 단지 그것을 이해하려고 노력하고 있습니다. – Snoopy