이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 24045|회답: 0

[콘솔 프로그램] .net/C#에서의 휘발성 키워드 학습

[링크 복사]
게시됨 2018. 5. 23. 오전 11:23:40 | | | |
MS 링크:하이퍼링크 로그인이 보입니다.

휘발성 키워드는 여러 스레드가 동시에 실행될 경우 필드를 수정할 수 있음을 나타냅니다. 휘발성으로 선언된 필드는 컴파일러 최적화에 의해 제한되지 않습니다(단일 스레드에 의해 접근된다고 가정할 때). 이렇게 하면 필드가 항상 최신 값으로 렌더링됩니다.

휘발성 수정자는 일반적으로 여러 스레드가 접근하지만 락 문으로 접근을 직렬화하지 않는 필드에 사용됩니다.

휘발성 키워드는 다음과 같은 유형의 필드에 적용할 수 있습니다:

  • 인용 유형.
  • 포인터 타입(안전하지 않은 맥락에서). 포인터 자체는 가변될 수 있지만, 가리키는 객체는 가변할 수 없다는 점에 유의하세요. 즉, "가변 객체에 대한 포인터"는 선언할 수 없다.
  • sbyte, byte, short, ushort, int, uint, uint, char, float, bool 같은 유형이 있습니다.
  • 다음 기본 타입 중 하나를 가진 열거 타입: 바이트, 스바이트, 쇼트, 유쇼트, 연수, 또는 유인트.
  • 참조 타입으로 알려진 일반 타입 파라미터들.
  • IntPtr과 UIntPtr.


변수 키워드는 클래스나 구조체의 필드에만 적용할 수 있습니다.국소 변수는 휘발성으로 선언할 수 없습니다


더 이상 쓸데없는 말 없이, 테스트할 루프를 작성해 보세요:

10,000번 반복해서 테스트해봅시다,A 값의 출력이 올바르다는 것을 발견했으나,설명이 안 돼volatile은 스레드 안전입니다왜냐하면 여러 번 테스트하면 계산 오류가 생긴다는 것을 알게 될 테니까요! 왜냐하면 올바른 결과가 나올 확률과 틀릴 가능성이 있기 때문입니다



코드:



다시 100,000개의 루프를 테스트해 보면, a의 값이 틀렸다는 것을 알 수 있습니다. 루프 수가 적을수록 오류 발생 확률이 낮아지고, 오차가 그렇게 명확하지 않기 때문입니다. 마치 방금 10,000번 루프 후에 오류가 없었던 것과 같습니다.

이때 자물쇠를 추가해 테스트하면, a의 값이 우리가 예상한 대로 올바르게 계산된 것을 알 수 있습니다.



코드:



요약: 위 예시에서 볼 수 있듯이 volatile은 스레드 안전을 보장하지 않습니다.




이전의:패킷 수집 도구 smsniff 2.0 중국어 버전을 다운로드하세요
다음:VS 원격 디버깅 "디버그 작업이 예상보다 오래 걸린다" 솔루션
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com