경합이 무엇입니까?

멀티스레드 애플리케이션을 작성할 때 경쟁 조건 중 가장 흔한 경험이 많은 문제가 있다.

내 질문을합니다 커뮤니티 다음과 같습니다.

경합이 무엇입니까? 그들을 탐지합니다 어떻게 해야 할까요? 어떻게 처리해야 할까요? 마지막으로, 이를 방지할 발생하지 않도록 어떻게 해야 할까요?

질문에 대한 의견 (3)
해결책

그들은 두 개 이상의 스래드입니다 경합이 있을 때 나타나는 데이터 공유됨 시도하시겠습니까 액세스하려면 변경하십시오 동시에건간에. 스케줄링 알고리즘을 교환할 수 있기 때문에 언제든지 스레드할 스래드입니다 전날에약혼자에게 don& # 39, 순서를 스래드입니다 액세스하려면 데이터 공유됨 시도할 수 있을지 알 수 없다. 따라서 스케줄링 알고리즘에 따라 변화를 분석한 결과, 즉, 데이터가 모두 스래드입니다 &quot racing&quot 스레드할 있다. / 변경하십시오 액세스하려면 데이터.

한 때 문제가 발생하는 경우가 자주 스레드할 수행합니까 check-then-act&quot "; (예를 들면 &quot check"; 값이 X 관심용 &quot act"; x 값에 따라 달라집니다 생각하신거야 할 수 있다), 또 다른 값으로, check&quot, &quot 사이에 있는 스레드할 있죠. 그리고 act&quot ";). E. g:

if (x == 5) // The "Check"
{
   y = x * 2; // The "Act"

   // If another thread changed x in between "if (x == 5)" and "y = x * 2" above,
   // y will not be equal to 10.
}

10 수, 또는 그 어떤 것도 될 수 있다는 점, y-축 여부에 따라 스레드할 변경일 x 사이에 있는 다른 방법을 확인하고 있어 실제 vmnet 없습니다.

일반적으로 발생하는 것을 막기 위해 경쟁 조건 둘 수 있도록 주변의 잠급니다 전날에약혼자에게 스레드할 한 번에 하나만 데이터 공유 데이터에 액세스할 수 있습니다. 이는 다음과 같은 의미를

// Obtain lock for x
if (x == 5)
{
   y = x * 2; // Now, nothing can change x until the lock is released. 
              // Therefore y = 10
}
// release lock for x
해설 (18)

&lt p&gt 매핑되며, 인종, &quot condition"; 이렇게 될 때 (또는 그 밖의 평행광) 코드 공유 리소스를 액세스할 수 있는 멀티 스레딩해야 승인하십시오 results.&lt /p&gt, 이런 식으로 예기치 않게 할 수 있다.

이거 예:

<! - 언어: c - &gt.

for ( int i = 0; i < 10000000; i++ )
{
   x = x + 1; 
}

이 코드를 실행, 한 번에 5 스래드입니다 &lt p&gt 했을 경우, x 의 값을 다니엘을 50,000,000 기술입니까 않을 것이라고 말했다. 사실, 각 run.&lt /p&gt 달라질 수 있지 않을까 생각한다 "고 말했다.

&lt p&gt 위해서는, 이 때문에, 각 스레드는 증분할, 그들은 x 의 값을 다음과 같이 합니다. (간편화된 분명히) &lt /p>;

&lt pre>; X 의 값을 읽어들입니다 이 값이 1 을 추가할 이 값을 저장하는 x &lt /pre>;

이 과정에서 언제든지 스레드할 p&gt &lt, 수, 모든 단계 단계 때, 그들은 언제든지 할 수 있는 공유됨 리소스에는 서로에 대한 도전이다. X 는 x 의 상태를 변경할 수 시간 동안 다른 사람이 스레드할 읽고 있을 때, /p&gt back.&lt 기록되었으므로 사이에 있다.

39 라고 Let& p&gt <;; s, t # 39 hasn& 스레드할 x 의 값을 읽어들입니다 있지만 아직 저장됩니까. 또한, 다른 스레드할 &lt 읽어들입니다 b&gt same&lt /b>;; (아직 없기 때문에 스레드할 변경되었습니까) 한 후 그들은 다시그것들을 x 의 값을 저장할 수 있으며, 모두 이 &lt b&gt same&lt /b>;; 가치 (x + 1), 다시 &lt /p&gt, x!

예: &lt pre>; 스레드 1: x, 값은 7 판독합니다 스레드 1: 이제 8 x 값이 1 을 추가할 스레드 2: , 값은 x, &lt b&gt 판독합니다 7&lt /b&gt. 스레드 1: 8 개 매장을 스레드 2: 1 x 8 자도으로 값은 이제 스레드 2: 8 in x&lt &lt b&gt, 저장, /b>; &lt /pre>;

일종의 &lt 적용함으로써 경쟁 조건,, /b&gt locking&lt b&gt 막을 수 있습니다. 전에 메커니즘을 코드와 액세스하며 공유 자원:

<! - 언어: c - &gt.

for ( int i = 0; i < 10000000; i++ )
{
   //lock x
   x = x + 1; 
   //unlock x
}

이 모든 time.&lt /p&gt 50,000,000) 로 나왔을 오토메이티드 p&gt <;;;

, &lt p&gt 잠금식 대한 자세한 검색: 임계 구역, 공유됨 resource.&lt /p&gt 뮤텍스에 세마포가,,

해설 (5)

&gt. 경합이 무엇입니까?

영화 틀렸다니까 갈 계획을 오후 5 시. 약 오후 4 시 티켓 가용성입니다 inquire 있습니다. 대표적인 있다고 사용할 수 있습니다. 창 5 분 전에 이를 너회가 긴장풀어 및 티켓 격이었다. # 39 m, 무슨 일이 합니다 i& 짐작할 수 있다. # 39 의 it& 전체 있었다. 이 기간 사이에 문제가 있다고 롬폭 확인 및 조치. 5 시 4 시 및 행동을 많이 있습니다. 한편 다른 사람이 티켓을 거머쥐었다. # 39 의 that& 경합이 - 특히 &quot check-then-act"; 책정안 인종 로드하십시오.

&gt. 그들을 탐지합니다 어떻게 해야 할까요?

코드 검토, 종교적 멀티스레디드 유닛 테스트. 지름길은 없다. 이에 대해 몇 가지 Eclipse 플러그인을 안정적인 아직이라구요 요구했으나 아무 일도 있다.

&gt. 어떻게 처리하고 이를 방지할?

자유롭고 독립적인 기능을 사용하여 만들 수 있는 최선의 일은 약간만이라도 불변 부작용을 최대한. 하지만 그 것이 항상 가능한 것은. 그래서 제바스티레비콘커랑드라토미츠 사용하여 데이터 구조, 동시, 배우 기반 동시성 통기화를 이벤트수정적절한 도움이 된다.

가장 필요한 자원을 제시프 동시에 수행할 수 있다. 좀 더 볼 수도 있습니다 (자세한 내용은 여기 위의 설명] 1.

해설 (7)

There is an 중요 기술 차이를 경쟁 조건 및 데이터 이다. 이러한 조건은 avamer 가정할 수 있지만, 대부분의 답을 주지 않는 것으로 보인다.

인종 때 발생하며, 하나 이상의 데이터 액세스 메모리 위치에 2 는 이 같은 지침을 액세스하며 쓰기 전에 이들 액세스하며 오더할 일이 없다. 주문하기 전에 민간인 이제라니 일이 많은 논란이 있지만, 일반적으로 같은 컨트롤러상의 쌍을 단점은 우록 잠급니다 변수와 변수 쌍 잠급니다 신호 대기 같은 컨트롤러상의 찼음을 전에 무슨 일이 있어도 효과를 오더할.

경합이 는 시맨틱 오류:. 이 시기에 발생하는 결함 또는 이벤트 오더할 이어지는 비헤이비어를 잘못된 프로그램 .

많은 경쟁 조건을 확인할 수 있지만, 그리고 인한 데이터 (, 실제로 있다) 이 필요하지 않습니다. 실제로, 데이터 인종, 인종, disk_b_s10database 괜찼습니다 조건이 필요한 충분한 조건을 채널이어야. [이] (http://blog.regehr.org/archives/490) 를 통해 간단한 예를 들어 블로그 포스트 잘 았겠습니다, 은행 거래 또한 차이를 설명했다. 여기 다른 간단한 [예] (https://stackoverflow.com/questions/11276259/are-data-races-and-race-condition-actually-the-same-thing-in-context-of-conc/18049303 # 18049303) 설명하는 말한다.

이제 이 용어를 처음 질문으로 답변을 다운되어도 꼭 보자.

경쟁 조건은 없다 '는 일반적인 방식으로 점을 감안하면 의미 버그 감지 저들이요 이는 구분할 수 있는 방법이 없기 때문에 일반적인 경우에 비헤이비어를 내장된 오토메이티드 oralce 올바른 vs. 잘못된 프로그램. 레이스 감지 백업이었습니다 결정 불가능 문제.

반면, 따라서 정확한 정의가 일치하지 않을 수도 있는 데이터 경합 투명지에 연관됩니까 남편과 한 멀티비트 저들이요 여러 가지 종류의 데이터 경합 검출기 (정적 및 동적 데이터 경합 감지, 록스트 기반 데이터 기반 데이터 검색, 하이브리드 레이스 레이스 레이스 감지, 전에 무슨 일이 있어도 데이터 검색). A state of the art 동적 데이터 레이스 검출기 (https://code.google.com/p/data-race-test/wiki/ThreadSanitizer) 는 [트레더산티저] 아주 잘 작동하는 실제로.

일반적으로 데이터 처리 인종 간의 데이터 공유 액세스하며 전에 무슨 일이 있어도 가장자리들을 유도하기 위해 필요한 몇몇 프로그래밍 기강 (중 개발, 위에 언급된 도구를 사용하여 일단 감지되는지). 변수, 세마포어, 조건 등을 통해 잠급니다 이 작업을 수행할 수 있습니다. 하지만 한 가지 프로그래밍 패러다임으로 피쳐도 자신과 같은 인종 하지 않는 데이터를 통해 메시지 전달 (대신 공유 메모리) 이다.

해설 (1)
  • 메모리 액세스 같은 위치에 있는 깊은 정렬하려면 정의는 &quot 때, 두 개의 스레드를 동시에 및 하나 이상의 액세스하며 는 write.&quo ; 이 상황에서 &quot reader"; 수도 이전 값이거나 스레드할 내려받습니다 &quot 스레드할 따라 새로운 가치를) 가 race."; 이 것은 항상 bug&amp, mdash, 사실 이러한 것들을 purpose&amp, mdash; 하지만 일반적으로 세계의 일부 정말 저급 알고리즘을 피해야 한다. # 39 에 대한 좋은 예를 @steve 구리 give& 때 문제가 될 수 있습니다.
해설 (2)

이러한 종류의 버그, 오로지 경합이 는 특정 시간 로드하십시오.

예: A, b 두 개의 스레드, 상상할 수 있어야 합니다.

스레드 A:

<! - 언어: c - &gt.

if( object.a != 0 )
    object.avg = total / object.a

스레드 B:

<! - 언어: c - &gt.

object.a = 0

만약 A, B 는 그냥 스레드할 선점되기 거쳐 a = 0 ',' is not null 로비치리아 있는지 확인 할 때, A 는 프로세서, it will do a &quot 스레드할 게인에서 zero&quot, 나눕니다.

이 버그는 스레드할 경우 발생할 경우, # 39 만 한 직후 선점되기 기술서임을 it& 매우 드물며, s 하지만 무슨 일이 일어날 수 있다.

해설 (0)

인종 관련 소프트웨어 뿐만 아니라 관련 하드웨어 조건이 너무. 실제로) 이라는 용어를 처음 의해 하드웨어일까요 있다.

위키백과 에 따르면:

&gt. 이 용어는 두 개의 신호를 전송하는 것이 를 통해 서로 레이싱 &gt. 영향력을 출력물에는 첫 .

&gt. 경합이 받을시간은 논리 회로가:

&gt. ! [입력하십시오. 이미지 여기에 설명을] [2]

이후 이 용어는 소프트웨어 (sw) 업계의 수정 없이 조금 이해하기 어려운 것을 알 수 있을 것입니다.

이를 위한 몇 가지 교체품 매핑하려면 필요한 소프트웨어를 세계:

  • &quot, 2 개의 signals&quot. = &gt. 2 개, 2 개의 processes&quot /&quot threads&quot ";;
  • &quot 영향력을 output"; = &gt. 일부 공유됨 state&quot 영향력을 ";

그래서, 인종, 2 개의 threads&quot 고말은 &quot 컨디션이 소프트웨어 (sw) 업계의 /&quot, 2 개의 processes&quot. 일부, 경주, 영향력을 위해 서로 &quot state&quot 공유됨, 최종 결과에 따라 달라질 수 있는 몇 가지 미묘한 차이 시/도 공유됨 타이밍 / 프로세스 실행, 스레드 / 프로세스 스케줄링, 일부 특정 인한 스레드할 주문하십시오 상술합니다.

해설 (0)

경쟁 조건 또는 다중 프로세스 멀티스레디드 애플리케이션을 발생할 수 있는 시스템. 경합이, 그 중 가장 기본적인 것은 아무 것도 할 수 있는 것은 두 가지 동일한 프로세스 판가름 날 것으로 가정하고 스레드할 또는 특정 조치를 취하지 않고 주문하십시오 할 때 하기 위해 이 같은 일이 일반적으로 스레드는 반군지역 메시지 확인, 멤버 변수를 설정하여, 두 가지 모두 클래스의 액세스하려면. # 39 의 경합이 한 때 거의 항상 there& 페이징됩니다 다른 작업을 마칠 수 있는 시간을 주기 위해 스레드할 스레드할 수면 (sleep) 에 있는 한 루프, 일부 검사 메커니즘은).

경쟁 조건 방지를 위한 도구에 대한 공통 언어 및 OS 가 아닌, 뮤텍스 (mutexes 종속적입니다 토마토는 섹션 및 일부 중요한 특징이다. # 39, 뮤텍스 (mutexes 지금 좋은 일을 할 때 smartupdate you& re only one. 신호는 smartupdate 일을 할 때 다른 사람이 잘 마쳤습니다. 예상치 못한 비헤이비어를 공유 리소스를 최소화하므로 막는 데 도움이 됩니다

경쟁 조건 감지, 수축됐는데 몇 예증들을 어려울 수 있습니다. 자는 코드에는 경쟁 조건 때문에 크게 의존하는 발생하기 쉽다 첫 확인할지 자고 페이징됩니다 영향을 받는 증상이다. 특히 긴 자는 추가 및 특정 이벤트 주문하십시오 인력용 시도하시려면 디버깅하지 사용할 수 있습니다. 이 때 유용합니다 비헤이비어를 사라지는 시기는 변경하여 재현할 것을 보고 내말들어봐 경우 it 솔루션 테스트를 위한 배치합니다. 이 후 디버깅하지 자는 없어야 한다.

이 경우, 1 개는 서명입니다 예중이 경합이 표시되어도 there& # 39 의 일부 시스템에서는 해당 간헐적으로 발생하는 문제입니다. 일반적인 버그 약간만이라도 충돌 및 교착 상태. 로깅하는, 영향을 받는 지역 및 직장 거기서 돌아온 찾을 수 있어야 합니다.

해설 (0)

경합이 치열한 경쟁을 벌이고 있는 상황을 동시 프로그래밍 () 는 2 개의 동시 스래드입니다 또는 프로세스 및 결과 최종 상태에 따라 리소스에는 누가 먼저 자원을 가져옵니다.

해설 (3)

기사 이 문제에 대해 구체적인 실제 가지고 게시됨에 dmx3 는 마이크로소프트 (ms) 의 경쟁 조건 및 교착 상태. It 에서 가장 추상적인 제목 단락 약간만이라도 요약:

&gt. 경합이 있을 때 나타나는 두 개의 스레드가 액세스함으로써 공유됨 가변으로 dell. &gt. 동시에요 첫 번째, 두 번째 가변적입니다 판독합니다 스레드할 &gt. 동일한 가치를 스레드할 판독합니다 변수다. 그럼 첫 번째 스레드할 &gt. 둘째, 그들은 그들의 작업을 수행할 스레드할 가치에 대한 인종 &gt. 스레드할 확인할 수 있는 마지막 공유 변수 값을 쓸 수 있다. &gt. 그 가치를 별색 보존 가치가 있는 것은 지난해 쓰기뿐만 스레드할 &gt. 이 때문에 마음이 있는 값은 이전 스레드할 오버라이트되는 &gt. 한다 "고 말했다.

해설 (0)

&gt. 경합이 무엇입니까?

이 프로세스는 상황을 상당한 종속적임 시퀀스나 타이밍 때 다른 이벤트.

예를 들어,

  • A 와 B * 모두 동일한 리소스에는 그들의 요구를 처리자에게 처리자에게 엑서큐션.

&gt. 그들을 탐지합니다 어떻게 해야 할까요?

툴과도 경합이 자동으로 검색할 수 있습니다.

&gt. 어떻게 처리해야 할까요?

        • 또는 세마포어 뮤텍스에 경합이 통해 처리할 수 있습니다. 그들은 역할을 할 수 있는 프로세스를 기반으로 자원을 잠급니다 확보를 위해 일정 조건을 경쟁 상태.

&gt. 이를 방지할 발생하지 않도록 어떻게 해야 할까요?

, 임계 구역 방지 등의 경합이 막기 위해 여러 가지입니다.

  1. 어떤 두 프로세스를 동시에 그 안에 중요한 하였다. ( 상호 배제)
  2. 가정이 없는 대해 결단을 속도용으로 또는 cpu 수입니다.
  3. 그 밖에 다른 프로세스를 실행할 수 있는 중요한 영역 프로세스 없음.
  4. 기다릴 수 없는 중요한 입력하십시오. 영생하리니 프로세스에서 해당 지역. (A 에서 B, C, B 의 리소스에는 기다리는 캜 리소스에는 기다립니다 리소스에는)

[2]: 도이 (http://citeseerx.ist.psu.edu/viewdoc/download), pdf, 유형 = = = 10.1.1.39.9581&amp 담당자별로 rep1&amp? [3]: http://web.cs.msu.edu/ ~ cse914/Readings/hybridDynamicRaceDetection-ppopp03.pdf

해설 (0)

이것은 고전적인 예는 쉽게 이해할 수 있는 은행 계좌 밸런싱할 새내기 스래드입니다 w.r.t. 자바 가상 머신 (jvm) 에 도움이 될 것입니다. 경쟁 조건:

<! - 언어: java - &gt.

public class BankAccount {

/**
 * @param args
 */
int accountNumber;
double accountBalance;

public synchronized boolean Deposit(double amount){
    double newAccountBalance=0;
    if(amountaccountBalance){
        return false;
    }
    else{
        newAccountBalance = accountBalance-amount;
        accountBalance=newAccountBalance;
        return true;
    }
}

public static void main(String[] args) {
    // TODO Auto-generated method stub
    BankAccount b = new BankAccount();
    b.accountBalance=2000;
    System.out.println(b.Withdraw(3000));

}
해설 (0)

바람직하지 않은 상황에서 디바이스입니다 경합이 백업이었습니다 때 발생하는 두 개 이상의 작업을 동시에 수행할 수 있지만, 또는 시스템 시도_횟수 특성상 작업 장치 또는 시스템, 올바르게 수행되었는지 위해서는 적절한 순서로 이루어져야 합니다.

컴퓨터 메모리, 스토리지를 경합이 경우 발생할 수 있습니다 많은 양의 데이터를 읽고 쓰는 명령을 받은 dell. 거의 같은 인스턴트, 및 시스템의 일부 또는 전부를 덮어쓸지 시도_횟수 오래된 데이터를 동시에 기존 데이터를 읽을 수 있는 중입니다. 그 결과 다음 중 하나 이상을 수 있습니다. 컴퓨터 고장, 오버클로킹된 &quot 불법 운영, "; 프로그램 데이터 또는 오류 발생 이전 통지 및 hutdown 오류뿐만 판독값 먹어서나 새로운 데이터.

해설 (0)

, 경합이 사용하는 경우, Atomic&quot &quot 막을 수 있습니다. 클래스. 그 이유는 단순히 개별 작업이 프레젠테이션이든 설정하고, 비유하사 don& 스레드할 # 39, t (아래 참조).

AtomicInteger ai = new AtomicInteger(2);
ai.getAndAdd(5);

그 결과, 7 인 https://partner. &quot ai&quot 합니다;;). 비록 재발했지 두 가지 작업을 모두 동일한 작업을 했지만, 확인, 아무도 간섭할 수 없는, 즉, 이 스레드할 스레드할 는 다른 경쟁 조건!

해설 (0)

경합이 백업이었습니다 바람직하지 않은 상황에서 두 개 이상의 속도로 데이터를 처리할 때 발생하는 액세스하려면 및 변경하십시오 공유됨 동시에요 이 때문에 일어난 충돌 액세스하며 리소스에는 수 있었다. 임계 구역 경합이 문제가 발생할 수 있습니다. 우리가 해결해야 할 중요한 조건 중 단 한 번에 처리할 수 있는 프로세스를 시행하십시오 아웃해야 실행하십시오 임계 구역.

해설 (0)

이 기본 시도하시겠습니까 경합이 더 나은 이해를 예:

    public class ThreadRaceCondition {

    /**
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        Account myAccount = new Account(22222222);

        // Expected deposit: 250
        for (int i = 0; i < 50; i++) {
            Transaction t = new Transaction(myAccount,
                    Transaction.TransactionType.DEPOSIT, 5.00);
            t.start();
        }

        // Expected withdrawal: 50
        for (int i = 0; i < 50; i++) {
            Transaction t = new Transaction(myAccount,
                    Transaction.TransactionType.WITHDRAW, 1.00);
            t.start();

        }

        // Temporary sleep to ensure all threads are completed. Don't use in
        // realworld :-)
        Thread.sleep(1000);
        // Expected account balance is 200
        System.out.println("Final Account Balance: "
                + myAccount.getAccountBalance());

    }

}

class Transaction extends Thread {

    public static enum TransactionType {
        DEPOSIT(1), WITHDRAW(2);

        private int value;

        private TransactionType(int value) {
            this.value = value;
        }

        public int getValue() {
            return value;
        }
    };

    private TransactionType transactionType;
    private Account account;
    private double amount;

    /*
     * If transactionType == 1, deposit else if transactionType == 2 withdraw
     */
    public Transaction(Account account, TransactionType transactionType,
            double amount) {
        this.transactionType = transactionType;
        this.account = account;
        this.amount = amount;
    }

    public void run() {
        switch (this.transactionType) {
        case DEPOSIT:
            deposit();
            printBalance();
            break;
        case WITHDRAW:
            withdraw();
            printBalance();
            break;
        default:
            System.out.println("NOT A VALID TRANSACTION");
        }
        ;
    }

    public void deposit() {
        this.account.deposit(this.amount);
    }

    public void withdraw() {
        this.account.withdraw(amount);
    }

    public void printBalance() {
        System.out.println(Thread.currentThread().getName()
                + " : TransactionType: " + this.transactionType + ", Amount: "
                + this.amount);
        System.out.println("Account Balance: "
                + this.account.getAccountBalance());
    }
}

class Account {
    private int accountNumber;
    private double accountBalance;

    public int getAccountNumber() {
        return accountNumber;
    }

    public double getAccountBalance() {
        return accountBalance;
    }

    public Account(int accountNumber) {
        this.accountNumber = accountNumber;
    }

    // If this method is not synchronized, you will see race condition on
    // Remove syncronized keyword to see race condition
    public synchronized boolean deposit(double amount) {
        if (amount < 0) {
            return false;
        } else {
            accountBalance = accountBalance + amount;
            return true;
        }
    }

    // If this method is not synchronized, you will see race condition on
    // Remove syncronized keyword to see race condition
    public synchronized boolean withdraw(double amount) {
        if (amount > accountBalance) {
            return false;
        } else {
            accountBalance = accountBalance - amount;
            return true;
        }
    }
}
해설 (0)

39, t 너회가 don& 언제든 무시하려면 경쟁 상태. 읽고 쓸 수 있는 여러 사람이 있으면 플래깅 스래드입니다 done& # 39, & # 39 로 설정되어 있으며, 이 플래깅. 한 사람이 있기 때문에 다른 스레드할 스레드할 정지점을 때, # 39, & # 39 로 설정되었습니다 프로세싱용으로 플래깅 done& 전날에약혼자에게 don& # 39, 인종, 해당 &quot condition&quot 된 것입니다. 탈락하는. 사실 이 분명히 한 것으로 찼음을 참조할 수 있다.

그러나 위한 도구를 사용하여 탐지로 경합이 있을 때, 눈에 유해한 경쟁 상태.

여기에 대한 자세한 내용은 http://msdn.microsoft.com/en-us/magazine/cc546569.aspx. 경합이

해설 (2)

작업을 고려해보십시오 디스크입니다. diskid 표시하십시오 카운트입니다 카운트입니다 증분됩니다 대로 된다. 요구사항뿐 가치, 즉, 즉시 카운티르트레더 증분을 디스플레토리드 표시하십시오 최근 업데이트된 값입니다.

int i = 0;

출력입니다

CounterThread -> i = 1  
DisplayThread -> i = 1  
CounterThread -> i = 2  
CounterThread -> i = 3  
CounterThread -> i = 4  
DisplayThread -> i = 4
        • 자주 업데이트 전에 값을 얻을 수 있는 여기 카운티르트레더 잠급니다 디스플레토리드 표시합니다. 이 같은 경쟁 상태. 경합이 시 크론제이션 사용하여 해결할 수 있습니다
해설 (0)