경합 상태, 교착 상태 설명

기술 자료 번역 기술 자료 번역
기술 자료: 317723 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

이 페이지에서

요약

Visual Basic.NET 또는 Visual Basic 2005 처음 Visual Basic 응용 프로그램에서 스레드를 사용 하는 기능을 제공 합니다. 스레드 경합 상태, 교착 상태 같은 디버깅 문제를 소개합니다. 이 문서에서는이 두 가지 문제입니다.

추가 정보

경합 상태

경합 상태 는 두 개의 스레드가 동시에 공유 변수에 액세스할 때 발생 합니다. 첫 번째 스레드가 변수를 읽고 및 두 번째 스레드가 변수를 같은 값을 읽습니다. 첫 번째 스레드가 및 두 번째 스레드가 다음 값을 해당 작업을 수행 하 고 스레드 수 값을 작성 마지막 공유 변수를 볼 수 있습니다 경쟁. 해당 값을 씁니다 스레드 값 마지막은 유지 되므로 스레드 값 쓰기는 이전 스레드를 작성 하.

자세한 정보 및 예제

각 스레드는 프로세서에서 실행 하는 시간 동안 할당 됩니다. 스레드에 대해 할당 된 시간이 만료 되 면 스레드의 컨텍스트 프로세서의 그 다음 턴 때까지 저장 되 고 프로세서가 다음 스레드가 실행을 시작 합니다.

한 줄 명령 경쟁 조건을 어떻게 될 수 있습니다? 경쟁 조건이 발생 하는 방법을 보려면 다음 예제를 검토 합니다. 두 개의 스레드가 있으며 둘 다 라는 공유 변수를 업데이트 하 (표현으로 dword ptr ds: [031B49DCh] 어셈블리 코드에서).

Visual Basic 코드:
   'Thread 1
   Total = Total + val1
				
   'Thread 2
   Total = Total - val2
				
(줄 번호)와 코드를 어셈블리 컴파일이 Visual Basic 코드에서:
 'Thread 1
 1.   mov         eax,dword ptr ds:[031B49DCh] 
 2.   add         eax,edi 
 3.   jno         00000033 
 4.   xor         ecx,ecx 
 5.   call        7611097F 
 6.   mov         dword ptr ds:[031B49DCh],eax 
				
 'Thread 2
 1.   mov         eax,dword ptr ds:[031B49DCh] 
 2.   sub         eax,edi 
 3.   jno         00000033 
 4.   xor         ecx,ecx 
 5.   call        76110BE7 
 6.   mov         dword ptr ds:[031B49DCh],eax 
				
어셈블리 코드를 살펴보면 작업의 수를 볼 수 간단한 더하기 계산을 실행 하려면 낮은 수준에서 프로세서가 수행. 스레드가는 프로세서에 그 시간 동안 전체 또는 일부를 해당 어셈블리의 코드 실행할 수 있습니다. 이제 경쟁 조건이이 코드에서 발생 하는 방법을 살펴보겠습니다.

합계는 100, val1 50입니다 및 val2 15입니다. 스레드 1 실행할 수 있는 기회를 가져옵니다 있지만 1-3 단계를 완료 합니다. 즉, 스레드 1 변수 읽고 추가. 스레드 1 이제 150 새 값을 쓸 기다리고만 있습니다. 스레드 1 중지 되 면 스레드 2 완전히 실행할 가져옵니다. 이에 쓴 값이 계산 하는 (85) out 변수 합계를 의미 합니다. 마지막으로 스레드 1 컨트롤이 회복 하 고 실행이 끝날. (150) 해당 값을 씁니다. 따라서 스레드 1이 완료 되 면 값의 합계는 이제 85 대신 150.

수 있습니다 어떻게 볼 수 있습니다 중대 한 문제입니다. 뱅킹 프로그램 인 경우 고객 없어야 자신의 계정에서 비용을 것입니다.

이 오류는 임의 스레드 1에서 해당 시간 전에 실행을 완료할 수 있으므로 프로세서가 만료, 다음 스레드 2 실행을 시작할 수 있습니다. 이러한 이벤트가 발생 하는 경우이 문제가 발생 하지 않습니다. 스레드 실행이 비 결정적인, 따라서 시간 또는 실행 순서를 제어할 수 없습니다. 또한 이때 스레드가 런타임 디버그 모드 대 다르게 실행 될 수 있습니다. 또한 계열에서 각 스레드를 실행 하면 오류가 발생 하지 않습니다 볼 수 있습니다. 이 무작위성이 이러한 오류를 추적 하 여 디버그 훨씬 어렵게 만듭니다.

경합 상태가 발생 하지 않도록 하려면 한 번에 하나의 스레드가 공유 변수에 액세스할 수 있도록 공유 변수를 잠글 수 있습니다. 이렇게 자주, 스레드 2의 실행이 중지 스레드 변수를 릴리스 1에 대 한 스레드 2 기다리는 동안 변수를 스레드 1에서 잠겨 스레드 2 또한 변수를 필요한 경우. (자세한 내용은이 문서의 "참조" 절의 "SyncLock" 참조).

현상

경합 상황의 가장 일반적인 증상은 예측할 수 없는 여러 스레드 간에 공유 되는 변수 값입니다. 이 스레드가 실행 되는 순서는 예측 불가능성에서 발생 합니다. 잠시 한 스레드가 wins 및 잠시 다른 스레드 wins. 다른 시간에 실행 올바르게 작동합니다. 또한 각 스레드는 별도로 실행 되 면 변수 값은 올바르게 작동 합니다.

교착 상태

교착 상태 는 두 스레드가 각각 다른 변수 동시에 잠그고 다른 스레드가 이미 잠근 변수를 잠그려면 다음 시도 하십시오 때 발생 합니다. 따라서 각 스레드 실행이 중지 되 고 변수를 해제 하려면 다른 스레드에서 대기. 각 스레드가 다른 스레드에서, 아무 일도 발생 하는 변수를 보유 하 고 스레드가 교착 상태를 유지 합니다.

자세한 정보 및 예제

다음 코드는 두 개체, LeftVal 및 RightVal.
'Thread 1
SyncLock LeftVal
 SyncLock RightVal
  'Perform operations on LeftVal and RightVal that require read and write.
 End SyncLock
End SyncLock
				
'Thread 2
SyncLock RightVal
 SyncLock LeftVal
  'Perform operations on RightVal and LeftVal that require read and write.
 End SyncLock
End SyncLock
				
교착 상태 스레드 1 LeftVal 잠그는 데 허용 되는 경우 발생 합니다. 프로세서에 스레드 1 실행을 중지 하 고 스레드 2의 실행을 시작. 스레드 2 잠금 RightVal 및 LeftVal 잠그는 시도 합니다. LeftVal 잠겨 있기 때문에 스레드 2 중지 되 고 LeftVal 해제 될 때까지 기다립니다. 스레드 2 중지 되어 있기 때문에 스레드 1 실행을 계속 하려면 허용 됩니다. 스레드 1 RightVal 잠그려면 시도 하지만 스레드 2가 잠근 것 때문에 수 없습니다. 따라서 RightVal 사용할 수 있게 될 때까지 대기할 스레드 1 시작 합니다. 각 스레드가 다른 스레드에서 대기 변수 잠갔으므로 각 스레드가 다른 스레드에 대 한 대기 및 두 스레드는 보유 하 고 있는 변수를 잠금 해제 합니다.

항상 교착 상태가 발생 하지 않습니다. 스레드 1 프로세서가 중지 하기 전에 두 잠금 실행 하는 경우 스레드 1 해당 작업을 수행 하 고 공유 변수를 잠금을 해제할 수 있습니다. 스레드 1 변수를 고정 한 후 예상 대로 해당 실행 스레드 2 시작할 수 있습니다.

이 오류 코드가 실제로 별도 모듈 또는 코드의 영역에서 나타날 수 있습니다 있지만 이러한 코드 조각을 나란히 배치 된 확실 한 것으로 보입니다. 이 같은이 코드를 올바른 실행 및 잘못 된 실행 모두 발생할 수 있기 때문에 추적 하기가 매우 어려운 오류.

현상

교착 상태의 일반적인 증상은 있는 프로그램이 나 스레드 그룹을 응답을 중지 합니다. 라고 응답입니다. 두 개 이상의 스레드가 각 기다리는 다른 스레드가 잠긴 변수가 됩니다. 다른 변수를 도달할 때까지 두 스레드가 해당 변수를 해제 합니다 때문에 스레드를 진행 하지 마십시오. 프로그램이 전체 실행 해당 스레드 중 하나 또는 모두를 대기 중인 경우 전체 프로그램 중지 될 수 있습니다.

스레드 무엇입니까?

프로세스가 단일 컴퓨터에서 지정한 시간에 실행 중인 다른 응용 프로그램을 구분 하는 데 사용 됩니다. 운영 체제 프로세스를 실행 하지 않습니다 하지만 스레드. 스레드가 실행 단위입니다. 운영 체제 스레드의 작업 실행 스레드에 프로세서 시간을 할당합니다. 단일 프로세스에서 여러 스레드 실행 포함할 수 있습니다. 각 스레드에 스케줄링 우선 순위 및 운영 체제 스레드가 프로세서에 할당 된 시간 동안 실행을 완료할 수 없는 경우 스레드의 컨텍스트를 저장 하는 구조의 집합을 자체 예외 처리기를 유지 관리 합니다. 컨텍스트 다음에 스레드에 프로세서 시간을 때까지 유지 됩니다. 컨텍스트는 스레드가 원활 하 게 실행을 계속 해야 하는 모든 정보를 포함 합니다. 이 정보는 스레드의 프로세서 레지스터 및 호출 스택을 호스트 프로세스의 주소 공간 안에 집합이 포함 됩니다.

참조

자세한 내용은 다음 키워드에 대 한 Visual Studio 도움말을 검색 합니다.
  • SyncLock. 개체를를 잠글 수 있습니다. 다른 스레드가 동일한 개체에 잠글 경우 첫 번째 스레드가 해제할 때까지 차단 됩니다. Synclock 오용에서 문제가 발생할 수 있으므로 신중 하 게 SyncLock을 사용 합니다. 예를 들어,이 명령을 경합 상태를 방지할 수 있지만 교착 상태가 발생할.
  • 연동. 선택 기본 숫자 변수 스레드로부터 안전한 작업 집합이 있습니다.
자세한 내용은 Microsoft 기술 자료의 다음 문서를 아래 문서 번호를 클릭 합니다.
316422 Visual Basic.NET에서에서 스레딩에 대 한 정보: 로드맵
자세한 내용은 다음 MSDN 웹 사이트를 참조 하십시오.
스레드 및 스레딩

속성

기술 자료: 317723 - 마지막 검토: 2013년 10월 29일 화요일 - 수정: 3.0
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
키워드:?
kbvs2005swept kbvs2005applies kbinfo kbmt KB317723 KbMtko
기계 번역된 문서
이 문서는 Microsoft 기계 번역 소프트웨어를 이용하여 번역되었으며 Microsoft Community에 의한 Community Translation Framework(CTF) 기술 혹은 사람이 번역한 내용에 의하여 사후 편집될 수 있습니다. Microsoft는 Knowledge Base에 있는 모든 문서에 다양한 언어로 접근할 수 있도록 하기 위하여 기계 번역, 사람에 의한 번역 및 커뮤니티가 편집한 내용을 모두 제공합니다. 번역된 문서는 어휘, 구문 및/혹은 문법에 오류가 있을 수 있습니다. Microsoft는 번역 오류로 인한 부정확성, 오류 및/또는 손해와 이를 고객이 사용하는 데에 대하여 책임을 지지 않습니다.
이 문서의 영문 버전 보기:317723

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com