레이스 컨디션 예제

공유 리소스에 액세스하는 다중 스레드(또는 병렬) 코드가 예기치 않은 결과를 발생시키는 방식으로 수행할 수 있는 경우 „경합 조건”이 존재합니다. hashTable에 대 한 코드에서 조건은, 키가 이미 없는 경우 다음 키/값 쌍을 저장 합니다. 따라서 이 경우 2개의 인터리빙 스레드는 모두 동일한 키로 다른 값을 넣을 수 있습니다… 조건이 있지만 일어나는 것을 막을 수 있습니다. 인종 조건의 한 정의는 „이벤트의 상대적 타이밍에 예기치 않은 중요 의존으로 인한 비정상적인 동작”으로 설명합니다. 이 정의는 하드웨어 및 소프트웨어 경합 조건에 모두 적용할 수 있다는 점에서 광범위합니다. 소프트웨어에서 경합 조건은 액세스가 설계에 의해 제대로 제어되지 않는 일부 공유 리소스로 인해 발생합니다. Microsoft는 실제로 이 인종 조건 및 교착 상태에 대한 자세한 기사를 발표했습니다. 가장 요약된 추상은 제목 단락입니다: 데이터 경합은 프로그램 정확성이 손상되지 않는다는 점에서 경합 조건을 초래할 필요가 없습니다. 데이터 경합이 아닌 경합 조건은 함께 제공되는 그림이 예인 일반 경주를 의미합니다.

„원자성” 클래스를 사용하는 경우 레이스 조건을 방지할 수 있습니다. 그 이유는 스레드가 작업을 분리하지 않고 get 및 set을 설정하는 경우, 예는 다음과 같습니다: 아래 의 이 줄에서:1입니다. if (! hashtable.contains(키){2. 해시테이블.put(키, 값);3. } 두 스레드 A와 B가 둘 다 2줄에 도달하기 전에 줄 1을 실행한다고 가정해 보입니다. Java 해시 테이블이 스레드에서 안전하더라도 가능합니다. 이 경우 두 스레드는 해당 시간에 시스템이 실행되는 방식에 따라 임의의 순서로 2줄을 실행하고 한 스레드는 다른 put의 값을 과도하게 작성합니다. 이 경우 전체 경우 블록이 아래와 같이 경주 조건을 해결하기 위해 동기화되어야합니다: 동기화 { if (! hashtable.contains(key))){ hashtable.put (key, value); } 동적 해석을 수행하고 발생할 수 있는 가능한 경합 조건을 표시하는 도구가 있습니다. 예를 들어 Java 및 인텔 검사기용 덮개의 스레드 분석기등이 있습니다. Clang 스레드 안전 분석은 경합 조건을 감지하는 정적 해석 도구입니다. ThreadSanitizer는 Clang 및 Go 언어에서 사용하는 C++로 작성된 데이터 경주 감지기입니다.

경합 조건은 두 개의 동시 스레드 또는 프로세스가 리소스를 위해 경쟁하고 결과 최종 상태가 리소스를 먼저 얻는 사람에 따라 달라지는 동시 프로그래밍의 상황입니다. 경주 조건을 방지하는 방법에는 여러 가지가 있습니다. 가장 기본적인 방법은 동기화 및 잠금을 사용하는 것입니다 – 낮은 수준의 프리미티브는 동시 알고리즘을 구축하는 것입니다. 또한 JDK는 상위 수준의 빌딩 블록으로 사용할 수 있는 광범위한 동시 컬렉션 및 원자 값을 제공합니다. „데이터 경주”라는 개념은 경주 조건의 한 유형입니다. 데이터 경합은 다양한 공식 메모리 모델의 중요한 부분입니다. 특히 C11 및 C++11 표준에 정의된 메모리 모델은 데이터 경합을 포함하는 C 또는 C++ 프로그램에 정의되지 않은 동작이 있음을 지정합니다. [3] [4] 특정 종류의 경주 조건은 술어(예:

Posted in Bez kategorii