2017-02-27 14 views
1

C++에서 메모리 장벽이 어떻게 작동하는지 알고 싶습니다. 예를 들어 , 그 경우 표준 : 원자 사용하고 :std :: atomic 메모리 장벽 이해

#include <iostream> 
#include <atomic> 

int main() 
{ 
    std::atomic<int> a; 
    int n = load();//returns 1 or other value written by other thread 
    a.store (n, std::memory_order_release); 
} 

코드 아래의 것과 동일한 의미하는 상기 코드는?

#include <iostream> 
#include <atomic> 
int main() 
{ 
    std::atomic<int> a; 
    int n = load(); 
    std::atomic_thread_fence(std::memory_order_release); 
    n = 100;//assume assignment is atomic 
} 

내가 맞다면, 내가 행동이 인수로 메모리 장벽을 수용 할 수있는 모든 C++ 기능 같다는 것을 확신 할 수 있습니까?

+0

주 함수의 두 번째 줄'int n = a.load (std :: memory_order_acquire) '과 두 번째 예제의 네 번째 줄'a = 100'을 의미합니까? – Oliv

+0

아니요,로드 함수는 std :: atomic load 함수가 아닙니다. 일부 데이터를 반환하는 사용자 구현 함수입니다. –

+0

예가 혼란스럽게 보입니다. 첫 번째 발췌문은 'a'에 값을 명확하게 저장합니다. 그러나 두 번째 발췌 부분은'a'를 전혀 언급하지 않습니다. 왜 그렇습니까? –

답변

0

아니,하지만이 동등의 :

#include <iostream> 
#include <atomic> 
int main() 
{ 
    std::atomic<int> a; 
    int n = load(); 
    std::atomic_thread_fence(std::memory_order_release); 
    a.store (12345, std::memory_order_relaxed); 
    n=100; 
} 

(값은 당신이 거기까지했던 것보다 차이가 있지만). 거기 울타리 안의 원자 저장소가되어야합니다. here에서 "울타리 - 울타리 동기화"또는 "울타리 - 원자 동기화"상태를 점검하십시오. a을 저장하는 데 제약이 설정되어 있지는 않지만 memory_order_release 내에 있으므로 n이됩니다. 그게 울타리입니다.

+0

나는 당신이 그 코드를 넣는 것을 이해한다. 스토어 (12345, std :: memory_order_relaxed); 원자 할당을 제공합니다. 나는 단지 실행 순서를 알고 싶다. 내 코드처럼 장벽에 영향을 줍니까? –

+0

@DarkRider'memory_order_release' 장벽은 당신이 원하는 모든 것보다 먼저 있어야합니다. 반면에'memory_order_acquire'의 장벽은 동기화하려는 모든 것의 뒤가되어야합니다. 그것이 "담장 (fence)"이라고 불리는 이유입니다. 마치 * release *로 시작하여 * acquire *로 끝나는 케이지에 동기화 된 것들을 넣는 것과 같습니다. 그 질문에 대답합니까? –

+0

나는 a.store (n, std :: memory_order_release)를 호출 할 때 알기를 원한다. 저장소 함수 내부의 모든 작업을 호출하기 전에 평균 장벽이 설정되어 있습니까? –