답변:
원자 연산은 내부에서 원자 연산을 사용하는 Mutexes 또는 Semaphores 와 같은 일종의 잠금 을 사용하거나 원자 및 메모리 펜스를 사용하여 잠금없는 동기화를 구현 하여 스레드 안전을 달성하는 방법 입니다.
따라서 기본 데이터 유형의 원자 연산은 스레드 안전을 달성하기위한 도구이지만 일반적으로 서로 의존하는 여러 작업이 있으므로 스레드 안전을 자동으로 보장하지 않습니다. Mutexes를 사용하여 이러한 작업을 중단없이 수행해야합니다.
예, c #에서 이러한 원자 데이터 유형 중 하나를 작성하는 것은 스레드로부터 안전하지만 스레드 안전에서 사용하는 기능을 만들지는 않습니다. 두 번째 스레드가 "동시에"액세스하는 경우에도 단일 쓰기가 올바르게 실행되도록합니다. 절대로, 현재 스레드에서 다음에 읽은 다음 다른 스레드가 이전에 쓴 값을 얻을 수 없으며 읽은 값만 유효합니다.
원자 성과 스레드 안전성은 서로 다른 두 가지입니다. 원자 성은 작업의 "전부 또는 전무"품질을 나타냅니다. 작업을 100 % 성공적으로 수행 할 수없는 경우 시스템은 작업의 일부가 시작되기 전의 전체 상태로 유지되어야합니다. 전형적인 예는 데이터베이스 트랜잭션입니다. 헤더 및 여러 개별 항목을 포함하여 송장을 저장할 때 모든 단일 데이터베이스 행의 모든 단일 부분을 성공적으로 배치해야합니다. 그렇지 않으면 데이터가 손실되거나 손상됩니다. 광고 항목을 삽입 할 수없는 경우 남아있는 다른 행을 삽입해서는 안되며 이미 처리 된 행은 남아 있지 않아야합니다.
스레드 안전성은 원 자성을 포함하여 오퍼레이션을 "재진입"할 수있는 것의 조합을 말합니다. 여러 작업자가 다른 작업에 영향을주지 않고 동일하거나 다른 시간에 시작하여 동일한 작업을 수행 할 수 있습니다. 스레드 안전 작동을위한 많은 모델이 있습니다. 이들 중 대부분은 개념적으로 완전히 격리 된 상태에서 여러 개의 병렬 작업을 실행하거나 (두 명의 작업자가 다른 작업자가 존재하는 것을 알지 않고도 두 개의 서로 다른 객체 또는 객체 모음에서 동일한 작업을 수행 할 수 있음) 또는 "파이프 라인"을 설정합니다. 여러 작업자가 각각 전체 작업 중 하나의 작업을 수행합니다 (각 작업자가 첫 번째 작업에서 다음 작업으로 진행하는 등). 또는 한 작업에 중점을두고 중간 "작업 제품"을 다음 작업자에게 전달합니다.
원 자성 작업은 중단 할 수없는 작업입니다.
안전한 스레드는 안전하게 중단 될 수있는 스레드입니다.
스레드 안전성은 원 자성 조작, 특히 중요한 자원이 여러 번 액세스되는 것을 방지하는 논리에서 확보됩니다.
기본 원자 연산은 Test-and-set 이며 세마포어를 구현하는 데 사용되며 스레드 안전을 구현하는 데 사용됩니다.