경쟁 상태
경쟁 상태는 소프트웨어 프로그램이 올바르게 작동하기 위해 하나 이상의 프로세스가 실행되는 시점에 의존할 때 발생합니다. 스레드가 예상하지 못한 시점에 실행되거나 완료되면 잘못된 출력이나 프로그램 교착 상태와 같은 예측할 수 없는 동작이 발생할 수 있습니다.
대부분의 소프트웨어 프로그램은 멀티스레드 방식으로 작동하므로 여러 스레드를 동시에 처리할 수 있습니다. 제대로 프로그래밍된 애플리케이션은 각 스레드의 결과가 예상된 순서로 처리되도록 합니다. 프로그램이 예측할 수 없는 순서로 실행되는 스레드에 의존하면 경쟁 상태가 발생할 수 있습니다.
간단한 예로 불리언 값을 처리하는 논리 게이트를 들 수 있습니다. AND 논리 게이트에는 두 개의 입력과 하나의 출력이 있습니다. 입력 A와 B가 모두 true이면 AND 게이트는 TRUE를 출력합니다. 입력 중 하나 또는 둘 다 false이면 FALSE를 출력합니다. 변수 A와 B가 로드되기 전에 프로그램이 논리 게이트의 결과를 확인하면 경쟁 상태가 발생할 수 있습니다. 올바른 처리 순서는 다음과 같습니다:
- 변수 A 로드
- 변수 B 로드
- AND 논리 게이트의 결과 확인
잘못된 순서는 다음과 같습니다:
- 변수 A 로드
- AND 논리 게이트의 결과 확인
- 변수 B 로드
위의 두 번째 예에서 얻는 결과는 첫 번째 예와 같을 수도 있고 다를 수도 있습니다. 예를 들어 변수 B가 로드되기 전과 후에 FALSE라면 결과는 달라지지 않습니다. A가 FALSE라면 B가 TRUE인지 FALSE인지는 중요하지 않습니다. 그러나 A와 B가 모두 true이면 결과는 TRUE여야 합니다. 논리 게이트의 결과를 확인한 후 변수 B를 로드하면 FALSE라는 잘못된 결과가 나옵니다.
경쟁 상태로 인해 일관되지 않은 출력이 생성되면 감지하기 어려운 버그가 발생할 수 있습니다. 프로그래머는 스레드가 일관된 순서로 처리되도록 하여 이러한 문제를 방지할 수 있습니다.
지식 테스트하기