2013-07-31 2 views
2

한 번에 여러 스레드에서 지역 변수에 액세스하는 방법에 대한 몇 가지 질문 :C#을 가변 스레드 안전

  1. 내가 여러 스레드가 작성하고 변수의 값을 읽고, 나는 그것에 대한 액세스를 동기화 여부를해야합니까?

  2. 변수는 Thread1에서 몇 초마다 업데이트되고 스레드 2에서 몇초마다 데이터베이스로 읽혀 업데이트됩니다.

  3. 논리를 보유하지 않고 동시성 문제가없는 경우 어떤 문제가 발생할 수 있습니까?

  4. 휘발성을 사용해야합니까?

편집 : 나는 내가 어떤 동시성 문제가없는 것을 강조하고 싶습니다

. 내 구체적인 시나리오는 다음과 같습니다.

a. 내 변수 이름은 pingLatency이고 핑 대기 시간은

b입니다. Thread1은 매 10 초마다 8.8.8.8로 핑을 보내고 대기 시간은 pingLatency

c로 씁니다. Thread2는 일치하는 필드를 pingLatency 값으로 매 10 초마다 갱신합니다.

d. Thread2는 매번 동일한 데이터베이스 행을 업데이트합니다.

이제이 데이터베이스 필드를 사용하여 네트워크 연결을 모니터링합니다. 내 질문은 - 변수가 업데이트되지 않거나 스레드 안전 문제로 인해 예외가 발생하는 상황이있을 수 있습니까? 난 그냥 과도한 것 같아서 lock 사용을 피하고 싶습니다.

당신은 어떻게 생각하십니까?

+1

답변 : 1. 그것은 다릅니다; 2. 그것은 달려있다; 3. 많이; 4 : 아마. 이 문제를 논의하기 위해 기존 질문을 검색하려고 했습니까? 스레드 안전과 관련된 많은 질문이 여기에 있습니다. –

+0

정확히 "지역 변수"란 무엇입니까? 예를 게시하십시오. –

+0

변수 *가 항상 * 로컬 *이므로 * 변수 *가 실제로 * 필드 *를 의미한다고 가정하면 여러 스레드에서 액세스 할 수 없습니다. –

답변

2
  1. 예는 methods to do this for you without locks
  2. 노 코멘트이 무엇을 의미하여
  3. 확실하지 ... 당신이 삽입 될 겁니다 가능성이있다, 그것은에 대한 액세스를 동기화한다 DB에 잘못된 값이 있습니다.
  4. Don't use volatile, per Eric Lippert, 지나치게 복잡하고 의미가 매우 이상합니다.

메모리 모델을 손상시키지 않도록 C#을 기준으로 데이터 다툼없는 프로그램 (SC-DRF)에 대한 순차적 일관성을 사용할 때 대부분의 다른 언어가 사용됩니다. 휘발성은 이것을 깨뜨리기 때문에 데이터 경합을 막기 위해 잠금 장치를 사용하십시오.

lock은 상상할 수있는만큼 무겁지 않습니다. 대부분의 경우 잠금은 상상하는 시나리오에서 경합하지 않습니다. 따라서 대부분의 경우 잠금 장치를 확보하는 것이 어려워 야합니다.

+0

에릭은 '휘발성'을 사용해서는 안된다고 말하지 않았으며 아마도 당신이 생각하는대로하지 않는다고 말했습니다 않습니다. '휘발성 (volatile)'은 그것이 무엇을 의미하는지 알면 완전히 적합합니다. –

+0

@ LasseV.Karlsen 문서가 Eric과 다른 것을 말하면서, MS도 "휘발성"이 무엇인지 모르는 것을 의미하므로 '휘발성'을 피할 것입니다. 또한 Eric은 SC-DRF가 '휘발성 (volatile)'으로 깨진다는 사실을 분명히하고있다. – Mgetz

+1

휘발성은 원자 필드 만 휘발성 일 수 있다는 점에서 원자를 의미합니다. –

0

.NET 관리 병렬을 사용하려면 기본 제공되는 좋은 것을 사용하십시오. Task Parallelism. 이것은 스레드를 관리 할 것이고 Array/List가 ConcurrentBag와 같은 배열 안전성 변수를 사용할 수 있습니다.

0

변수에 대한 액세스 권한이 원자 적이며 논리적 인 문제가없는 경우 당신은 괜찮아요. this에 따르면 원자 변수를 사용하고 있는지 알 수 있습니다. 그것은 원시적 형태 인 경우

+1

메모리 펜스, 휘발성 필드 사용 등을 알고 있다고 가정하고 있습니다. –