문제

은에 액세스 bool 분야 원자에서는 C#?특히,필요한가요 잠금을 주변:

class Foo
{
   private bool _bar;

   //... in some function on any thread (or many threads)
   _bar = true;

   //... same for a read
   if (_bar) { ... }
}
도움이 되었습니까?

해결책

그렇습니다.

읽기 및 쓰기에 다음과 같은 데이터의 유형은 원자:bool,char,byte,sbyte,짧은,ushort,uint,int,float,그리고 참조 형식입니다.

에서 발견 C#언어 Spec.

편집:그것은 아마도 가치를 이해 휘발성 키워드입니다.

다른 팁

으로 명시된 위 bool 은 원자 하지만 당신은 여전히 필요를 기억하는 것도에 따라 달라집니다 그것으로 할 수 있습니다.

if(b == false)
{
    //do something
}

아 원자 작업을 의미하는 b 값을 변경할 수 있습기 전에 현재 실행 코드 후면 문입니다.

bool 액세스는 실제로 원하지 않는 전 이야기입니다.

당신을 걱정할 필요가 없을 읽고에 대한 값은'불완전하게 작성'-그것을 명확하지 않을 무엇을 가능성이 있는 의미에 대한 bool 에 어떤 경우-하지만 당신은 당신에 대해 걱정하는 프로세서 캐시 적어도 경우,타이밍의 세부 사항이 있는 문제입니다.만약 thread#1 에서 실행 되는 핵심은 당신 _bar 에서 캐시 _bar 을 얻에 의해 업데이트 thread#2 에서 실행되는 또 다른 핵심,thread#1 이 표시되지 않은 즉시 변경을 추가하지 않으면 잠금,선언 _barvolatile, 또는 명시적으로 삽입 통화 Thread.MemoryBarrier() 무효화하고 캐시 값입니다.

접근법으로 사용,그리고 나는 생각이 올바른가

volatile bool b = false;

.. rarely signal an update with a large state change...

lock b_lock
{
  b = true;
  //other;
}

... another thread ...

if(b)
{
    lock b_lock
    {
       if(b)
       {
           //other stuff
           b = false;
       }
     }
}

의 목표는 기본적으로 하는 것을 피하기 위해 repetively 잠금체에의 반복을 확인하는 경우 우리가 우리가 잠금을 제공하기 위해서는 큰 금액의 상태 정보를 변경하는 거의 발생하지 않는다.나 생각 이 방법을 작동합니다.면 절대적인 승 필요한 I 생각 휘발성이 적절할 것이 b bool.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top