2014-02-25 3 views
0

포인터 변수의 할당이 원자 적이라는 보장이 있습니까?원자 포인터 할당에 대한 보장

struct S {char a; int* p;}; 
S * p1 = new S; 
S * p2 = new S; 

p1 = p2; 
+1

"할당"을 의미합니다. "Affectation"은 프로그래밍 컨텍스트에서 의미가 없습니다. –

+0

@SebastianRedl 하, 코드를 기반으로 답변했습니다 .... 그런 단어가 무엇을 의미하는지 모르겠습니까 = P –

+0

감사를 편집했습니다 – Guillaume07

답변

3

아니요, 그렇기 때문에 C++에는 atomic 유형이 있습니다.

+0

왜 인수 할 수 있습니까? – Guillaume07

+0

@ Guillaume07 왜? 이것은 단지 그것을 보장하는 것입니다. (그리고 그 비용은 원 자성을 제공하기위한 비용이 있습니다) 원자력이 있습니다. –

1

C++ 03에는 스레드를 인식하지 못하기 때문에 이러한 보장이 없습니다. 그러나 Win32에서 포인터 할당은 원자 적으로 보장됩니다.

올바르게 정렬 된 32 비트 변수에 대한 단순 읽기 및 쓰기는 원자 연산입니다. 바꾸어 말하면, 업데이트 된 변수의 한 부분 만 으로 끝나지 않을 것입니다. 모든 비트는 원자 패션으로 업데이트됩니다. 그러나 액세스가 동기화되는 것은 아닙니다. 두 개의 스레드가 동일한 변수에서 읽고 쓰는 경우 다른 스레드가 쓰기 작업을 수행하기 전에 하나의 스레드가 해당 읽기 작업을 수행 할 것인지를 결정할 수 없습니다.

정확히 일치하는 64 비트 변수는 에 간단히 읽고 쓰며 64 비트 Windows에서는 원자 적입니다. 을 읽고 64 비트 값에 대한 쓰기가 32 비트의 Windows에서 아토믹하지 않을 수도 있습니다. 다른 크기의 변수에 대한 읽기 및 쓰기는 이 모든 플랫폼에서 원자 적이어야 함을 보장하지 않습니다.

C++ 11에서는 std :: atomic을 사용하지 않는 한 그러한 보증이 없습니다.

관련 문제