FIX: 다중 스레드 응용 프로그램의 std::map::erase 또는 std::set::erase에서 액세스 위반

이 문서가 보관되었습니다. "그대로" 제공되었으며, 업데이트가 되지 않을 것입니다.
현상
여러 스레드에서 동시에 std::map::erasestd::set::erase 구성원 함수를 호출하면 액세스 위반이 발생할 수 있습니다.
현재 상태
Microsoft는 이 문서의 시작 부분에 나열한 제품에서 이 문제를 확인했습니다.

이 버그는 Microsoft Visual Studio 6.0 서비스 팩 5(SP5)에서 해결되었습니다.

서비스 팩 5를 다운로드하려면 다음 Microsoft 웹 사이트의 Visual Studio Product Updates 페이지를 참조하십시오.
추가 정보
248477에서 설명한 버그를 해결했을 때 버그가 Visual Studio 6.0 서비스 팩 4(SP4)에 소개되었습니다.

자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
248477 FIX: 다중 스레드 응용 프로그램에서 STL Map 또는 Set를 사용하면 교착 상태가 된다

동작을 재현하는 방법

다음 코드 예제는 버그를 보여줍니다.
// Test.cpp// Compiler option needed: /MT or /MD#include <windows.h>#include <set>typedef std::set<int> TestSet;DWORD WINAPI Worker( LPVOID ){TestSet set;int g_cIters =4;    for( int i=0; i < g_cIters; i++ )    {        int r = rand();        int j;        for( j=0; j < r; j++ )        {        set.insert( j );        }        for( j=0; j < r; j++ )        {            TestSet::iterator it = set.find( j );            set.erase( it );        }    }     return 0;}           void main(){       int cThreads = 10;    HANDLE  aThreads[10];    for( int i=0; i < cThreads; i++ )    {        aThreads[i] = CreateThread( NULL, 0, Worker, NULL, 0, NULL );    }    WaitForMultipleObjects( cThreads, aThreads, TRUE, INFINITE );} 				




Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면 Microsoft 뉴스 그룹에 참여하시기 바랍니다.
속성

문서 ID: 281446 - 마지막 검토: 01/10/2015 12:53:14 - 수정: 2.3

The C Run-Time (CRT)

  • kbnosurvey kbarchive kbbug kbcpponly kbfix kbstl kbvc600fix kbvs600sp5fix KB281446
피드백