경합 상태, 교착 상태 설명

이 문서는 Microsoft 기계 번역 소프트웨어를 이용하여 번역되었으며 Microsoft Community에 의한 Community Translation Framework(CTF) 기술 혹은 사람이 번역한 내용에 의하여 사후 편집될 수 있습니다. Microsoft는 Knowledge Base에 있는 모든 문서에 다양한 언어로 접근할 수 있도록 하기 위하여 기계 번역, 사람에 의한 번역 및 커뮤니티가 편집한 내용을 모두 제공합니다. 번역된 문서는 어휘, 구문 및/혹은 문법에 오류가 있을 수 있습니다. Microsoft는 번역 오류로 인한 부정확성, 오류 및/또는 손해와 이를 고객이 사용하는 데에 대하여 책임을 지지 않습니다.

이 문서의 영문 버전 보기: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 1SyncLock LeftVal SyncLock RightVal  'Perform operations on LeftVal and RightVal that require read and write. End SyncLockEnd SyncLock				
'Thread 2SyncLock RightVal SyncLock LeftVal  'Perform operations on RightVal and LeftVal that require read and write. End SyncLockEnd 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 웹 사이트를 참조 하십시오.

경고: 이 문서는 자동으로 번역되었습니다.

속성

문서 ID: 317723 - 마지막 검토: 10/29/2013 01:01:00 - 수정: 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
피드백