레이스컨디션 예제

hashTable에 대 한 코드에서 조건은, 키가 이미 없는 경우 다음 키/값 쌍을 저장 합니다. 따라서 이 경우 2개의 인터리빙 스레드는 모두 동일한 키로 다른 값을 넣을 수 있습니다… 조건이 있지만 일어나는 것을 막을 수 있습니다. 컴퓨터 프로그램이 비차단 소켓으로 작성될 때도 경합 조건이 존재할 수 있으며, 이 경우 프로그램의 성능은 네트워크 링크의 속도에 따라 달라질 수 있습니다. 내부 변수가 변경되는 순서가 상태 머신이 종료되는 최종 상태를 결정할 때 중요한 경합 조건이 발생합니다. 레이스 조건은 소프트웨어 설계자가 피하고 싶은 것입니다. 그러나 일부 연구자들은 난수를 생성하는 데 사용할 수 있음을 보여주기 위해 시도했다. 이는 운영 체제의 스케줄러에 따라 달라지며, 그 자체로 는 무작위가 아닙니다. 임의성은 “실행 환경, 캐시 누락, 명령 실행 파이프라인 및 타이머 인터럽트를 생성하는 데 사용되는 하드웨어 클럭의 부정확성”을 기반으로 컨텍스트 스위치를 트리거하여 가져옵니다. 로직 게이트가 동일한 소스에서 서로 다른 경로를 따라 이동한 신호를 결합할 때 경합 조건의 전형적인 예가 발생할 수 있습니다.

게이트에 대한 입력은 소스 신호의 변화에 따라 약간 다른 시간에 변경될 수 있습니다. 출력은 잠시 동안 원치 않는 상태로 변경된 후 다시 설계된 상태로 정착할 수 있습니다. 특정 시스템은 이러한 결함을 견딜 수 있지만 이 출력이 메모리를 포함하는 추가 시스템의 클럭 신호로 작동하면 시스템이 설계된 동작에서 빠르게 벗어날 수 있습니다(사실상 일시적인 결함이 영구적인 결함이 됨). 생명에 중요한 시스템의 소프트웨어 결함은 재앙이 될 수 있습니다. 인종 조건은 Therac-25 방사선 치료 기계의 결함 중 하나였으며, 이는 적어도 3 명의 환자와 여러 명의 부상으로 이어졌습니다. [17] 소프트웨어의 경합 조건을 감지하는 데 도움이 되는 많은 소프트웨어 도구가 있습니다. 정적 분석 도구와 동적 해석 도구의 두 그룹으로 크게 분류할 수 있습니다. 여러 클라이언트가 웹 서버에 병렬로 요청을 전송하므로 웹 응용 프로그램은 여러 스레드 또는 프로세스를 생성하여 요청을 처리해야 하므로 경합 상태가 발생할 수 있습니다.

단일 사용자 세션의 경우에도 레이스 조건이 가능합니다. 예를 들어 웹 채팅 응용 프로그램은 주기적으로 AJAX 요청을 보내 최신 업데이트를 확인할 수 있습니다. 동시에 사용자는 새 채팅 메시지를 만들 수 있습니다. 컴퓨팅 환경에서는 메모리 또는 저장소 액세스를 직렬화하여 경합 조건을 방지할 수 있습니다. 즉, 읽기 및 쓰기 명령이 가까이 수신되면 읽기 명령이 실행되고 기본적으로 먼저 완료됩니다. NASA의 화성 스피릿 로버는 초기화 프로세스로 변수에 대한 쓰기 액세스를 얻을 수 없는 경주 조건을 겪었습니다. 예외가 발생했습니다. 또 다른 경우에는 이미징 모듈이 메모리에서 읽기를 시도하는 동안 비활성화 프로세스가 트리거되었습니다.

다른 문제, 아마도 경주 조건 관련, 보고 되었습니다. 약한 메모리 시스템에 대한 데이터 경합을 감지하는 논문[7]은 다른 정의를 제공합니다: 또 다른 예는 GE Energy에서 제공하고 오하이오에 기반을 둔 FirstEnergy Corp(다른 전력 시설 중)에서 사용하는 에너지 관리 시스템입니다. 경보 하위 시스템에 는 경합 조건이 존재했습니다. 세 개의 처진 전력선이 동시에 트립되면 경고가 모니터링 기술자에게 제기되지 않도록 하여 문제에 대한 인식이 지연되었습니다. 이 소프트웨어 결함은 결국 2003 년 북미 정전으로 이어졌다. [18] GE Energy는 나중에 이전에 발견되지 않은 오류를 수정하기 위한 소프트웨어 패치를 개발했습니다.