문제

이 코드는 스레드-안전입니까? 또는 이런 식으로 넣으십시오.

어쨌든 getit ()를 호출 할 수 있고 getit ()는 동일한 숫자를 2 개의 다른 스레드로 반환합니다.

Private Shared hitCount As Long = 1

Public Shared Function GetIt() As Long
     Threading.Interlocked.Increment(hitCount)
     DoSomethingQuick(hitCount)
     Return hitCount
End Function

가능한 것 같아요, 내가 사용해야하나요 Interlocked.Read() 아니면 한 블록에 모든 것을 잠그시겠습니까?

도움이 되었습니까?

해결책

예, 가능성이 있습니다.

  1. 스레드 1이 실행됩니다 Threading.Interlocked.Increment(hitCount)
  2. 스레드 2가 실행됩니다 Threading.Interlocked.Increment(hitCount)
  3. 스레드 1이 실행됩니다 Return hitCount
  4. 스레드 2가 실행됩니다 Return hitCount

3 단계와 4 단계에서 HitCount는 동일한 값이됩니다.

그러나 수정 사항은 쉽게 연동됩니다. INCREMERT 증분 값을 반환하므로 코드를 다음과 같이 변경하십시오.

Private Shared hitCount As Long = 1L

Public Shared Function GetIt() As Long
     Return Threading.Interlocked.Increment(hitCount)
End Function

편집하다또는 이제 편집을 기준으로, 당신은 약간의 타이밍 구멍이 있습니다. 어쨌든 이것은 당신이 원하는 것입니다.

Public Shared Function GetIt() As Long
     Dim localHitCount As Long = Threading.Interlocked.Increment(hitCount)
     Console.Writeline("Something, something....")
     Return localHitCount 
End Function

편집하다그런 다음 이것을하십시오 (이것은 Michael이 아래에서 제안한 것입니다)

Private Shared hitCount As Long = 1L

Public Shared Function GetIt() As Long
     Dim localHitCount As Long = Threading.Interlocked.Increment(hitCount)
     DoSomethingQuick(localHitCount )
     Return localHitCount 
End Function
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top