원자 작업과 스레드 안전의 차이점은 무엇입니까?


10

내가 본 토론에서 원자 작동스레드 안전성 은 같은 것으로 보이지만 많은 사람들이 서로 다르다고 말합니다. 차이가 있다면 누구든지 차이를 말해 줄 수 있습니까?


4
원자 작업은 스레드 안전을 보장하는 데 도움이되지만 어떻게 동일한 작업을 수행 할 수 있습니까? "스레드"는 "작동"과 다릅니다.
user50849

답변:


11

원자 연산은 내부에서 원자 연산을 사용하는 Mutexes 또는 Semaphores 와 같은 일종의 잠금 을 사용하거나 원자 및 메모리 펜스를 사용하여 잠금없는 동기화를 구현 하여 스레드 안전을 달성하는 방법 입니다.

따라서 기본 데이터 유형의 원자 연산은 스레드 안전을 달성하기위한 도구이지만 일반적으로 서로 의존하는 여러 작업이 있으므로 스레드 안전을 자동으로 보장하지 않습니다. Mutexes를 사용하여 이러한 작업을 중단없이 수행해야합니다.

예, c #에서 이러한 원자 데이터 유형 중 하나를 작성하는 것은 스레드로부터 안전하지만 스레드 안전에서 사용하는 기능을 만들지는 않습니다. 두 번째 스레드가 "동시에"액세스하는 경우에도 단일 쓰기가 올바르게 실행되도록합니다. 절대로, 현재 스레드에서 다음에 읽은 다음 다른 스레드가 이전에 쓴 값을 얻을 수 없으며 읽은 값만 유효합니다.


int, bool, float은 스레드 안전 또는 원자입니까?
user960567

1
@ user960567-데이터 유형은 데이터 유형입니다. 액세스 방법을 결정하는 것은 컴파일러의 책임입니다. 8086 CPU의 int64를 생각해보십시오.
mouviciel

2
C #에서 구체적으로 질문에 태그가 지정되고 읽기 및 쓰기 기본 데이터 유형에서 원자 적 이어야합니다 . Ecma 334
user50849를

2
그리고 예, c #에서 이러한 원자 데이터 유형 중 하나를 작성하는 것은 스레드로부터 안전하지만 스레드 안전에서 사용하는 기능을 만들지는 않습니다. 두 번째 스레드가 "동시에"액세스하는 경우에도 단일 쓰기가 올바르게 실행되도록합니다. 절대로, 현재 스레드에서 다음에 읽은 다음 다른 스레드가 이전에 쓴 값을 얻을 수 없으며 읽은 값만 유효합니다.
Archy December

4
x = 5는 C #에서 원자 적입니다. 그러나이 작업 직후에 덮어 쓸 수 있습니다. x = x + 1은 1에 의해 실행됩니다. x를 레지스터 2에로드합니다. 레지스터 x에 x를 증분합니다. x를 메모리에 저장합니다. 두 번째 스레드가 동시에 동일한 작업을 수행하면 둘 다 동일한 값을로드하고 증가시키고 저장하여 x를 두 번이 아닌 한 번만 증가시킵니다. InterlockedIncrement는 특수 프로세서 명령어를 사용하여 원자 단위 증분을 실행하거나 CAS와 같은 잠금 메커니즘을 사용하여 새 값을 쓰지 않는 동안 다른 스레드가 이전 값을 읽을 수 없도록합니다.
Archy

3

원자 성과 스레드 안전성은 서로 다른 두 가지입니다. 원자 성은 작업의 "전부 또는 전무"품질을 나타냅니다. 작업을 100 % 성공적으로 수행 할 수없는 경우 시스템은 작업의 일부가 시작되기 전의 전체 상태로 유지되어야합니다. 전형적인 예는 데이터베이스 트랜잭션입니다. 헤더 및 여러 개별 항목을 포함하여 송장을 저장할 때 모든 단일 데이터베이스 행의 모든 ​​단일 부분을 성공적으로 배치해야합니다. 그렇지 않으면 데이터가 손실되거나 손상됩니다. 광고 항목을 삽입 할 수없는 경우 남아있는 다른 행을 삽입해서는 안되며 이미 처리 된 행은 남아 있지 않아야합니다.

스레드 안전성은 원 자성을 포함하여 오퍼레이션을 "재진입"할 수있는 것의 조합을 말합니다. 여러 작업자가 다른 작업에 영향을주지 않고 동일하거나 다른 시간에 시작하여 동일한 작업을 수행 할 수 있습니다. 스레드 안전 작동을위한 많은 모델이 있습니다. 이들 중 대부분은 개념적으로 완전히 격리 된 상태에서 여러 개의 병렬 작업을 실행하거나 (두 명의 작업자가 다른 작업자가 존재하는 것을 알지 않고도 두 개의 서로 다른 객체 또는 객체 모음에서 동일한 작업을 수행 할 수 있음) 또는 "파이프 라인"을 설정합니다. 여러 작업자가 각각 전체 작업 중 하나의 작업을 수행합니다 (각 작업자가 첫 번째 작업에서 다음 작업으로 진행하는 등). 또는 한 작업에 중점을두고 중간 "작업 제품"을 다음 작업자에게 전달합니다.


2

원 자성 작업은 중단 할 수없는 작업입니다.

안전한 스레드는 안전하게 중단 될 수있는 스레드입니다.

스레드 안전성은 원 자성 조작, 특히 중요한 자원이 여러 번 액세스되는 것을 방지하는 논리에서 확보됩니다.

기본 원자 연산은 Test-and-set 이며 세마포어를 구현하는 데 사용되며 스레드 안전을 구현하는 데 사용됩니다.


다단계 작업을 중단하고 변경 사항 롤백이 보장되는 경우 여전히 원자라고 할 수 없습니까?
user50849

1
아닙니다. 원자는 그것의 어원 학적 의미로 이해되어야합니다 : ἄτομος, atomos, 불가분의.
mouviciel

int, bool, float은 스레드 안전 또는 원자입니까?
user960567

그러나 차이 거기되지 않은 것으로 indivisble하고 나타나는 A와 불가분의 관찰자는 ? 정의에 따르면 원 자성 연산에는 단일 단계 이상이 포함될 수 있습니다. 나는 위키 백과의 원자 작전 정의 에서 "나타난다"라는 단어 가 중요 하다고 믿는다 . (누군가가 그것을 가지고 싶다면 채팅에있어) :)
user50849

한 가지 큰 차이점이 있습니다. 안전한 스레드가 중단 될 수 있으며 시간이 얼마 남지 않았습니다. 이는 실시간 컴퓨팅에서 중요합니다. 원 자성 연산 (다단계 인 경우 인터럽트 잠금 포함)은 예측 가능한 시간 후에 종료되도록 보장됩니다.
mouviciel

1

스레드 안전성은 프레임 워크 또는 "개념"이며 원자 연산은 하위 스레드로 분류되며 '스레드 안전'으로 분류 된 상태를 달성하는 수단 (다수 중 하나)입니다.

스레드 안전성은 하나의 액세스 (및 데이터 조작)가 다른 스레드의 작동 무결성을 손상시키지 않는 별도의 스레드로 액세스 할 수있는 프로세스를 말합니다.

프로그래머의 많은 기술은 상황과 주요 목표에 따라 잠금, 세마포어, 래치, 원자 객체, 동기화 규칙 등과 같은 구현 방법을 알고 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.