C ++ 초안 표준에서는 "강하게 발생합니다"라는 문구가 여러 번 사용되었습니다.
예 : 종료 [basic.start.term] / 5
std :: atexit ([support.start.term] 참조)를 호출하기 전에 정적 저장 기간이있는 객체의 초기화 완료가 강력하게 발생하면 함수 호출이 std :: atexit에 전달되었습니다. 객체의 소멸자를 호출하기 전에 시퀀스됩니다. 정적 저장 시간으로 객체의 초기화가 완료되기 전에 std :: atexit에 대한 호출이 강하게 발생하면 함수에 대한 호출이 std :: atexit에 전달되기 전에 객체의 소멸자에 대한 호출이 순서화됩니다. . std :: atexit에 대한 호출이 std :: atexit에 대한 다른 호출 전에 강력하게 발생하는 경우, 두 번째 std :: atexit 호출에 전달 된 함수에 대한 호출은 함수에 대한 호출이 첫 std :: atexit 호출.
그리고 데이터 레이스 [intro.races] / 12 에서 정의
다음 중 하나에 해당하면 평가 A가 평가 D보다 먼저 발생합니다.
(12.1) A가 D보다 먼저 시퀀싱되거나
(12.2) A는 D와 동기화되고 A와 D는 순차적으로 일관된 원자 연산 ([atomics.order])이거나
(12.3) 평가 B와 C가있어서 A가 B보다 먼저 시퀀싱되고, B가 단순히 C보다 먼저 일어나고, C가 D보다 먼저 시퀀싱된다.
(12.4) A가 B보다 먼저 일어나고 B가 D보다 먼저 일어나도록 평가 B가있다.
[참고 : 비공식적으로, A가 B보다 먼저 발생하면 모든 상황에서 A가 B보다 먼저 평가되는 것으로 보입니다. 제외 작업이 제외되기 전에 발생합니다. — 끝 참고]
"강력하게 전에"일어난 이유는 무엇입니까? 직관적으로 "이전에 일어난 일"과의 차이점과 관계는 무엇입니까?
노트에서 "A는 모든 상황에서 B보다 먼저 평가되는 것"은 무엇을 의미합니까?
(참고 :이 질문에 대한 동기 부여는 피터 코르의 의견은 아래에 이 대답 .)
추가 표준 인용문 (Peter Cordes 덕분에)
순서와 일관성 [atomics.order] / 4
펜스를 포함하여 모든 memory_order :: seq_cst 작업에는 다음과 같은 제약 조건을 충족하는 단일 총 차수 S가 있습니다. 먼저 A와 B가 memory_order :: seq_cst 연산이고 A가 B보다 먼저 발생하는 경우 A는 S에서 B보다 우선합니다. 둘째, 객체 M의 모든 원자 연산 A와 B에 대해 A는 일관성 순서로 정렬됩니다. B 이전에 S는 다음 4 가지 조건을 만족해야합니다.
(4.1) A와 B가 모두 memory_order :: seq_cst 연산이면 A는 S에서 B보다 우선합니다. 과
(4.2) A가 memory_order :: seq_cst 연산이고 B가 memory_order :: sseq_cst 펜스 Y 전에 발생하면 A가 S에서 Y보다 우선합니다. 과
(4.3) memory_order :: seq_cst 펜스 X가 A보다 먼저 발생하고 B가 memory_order :: sseq_cst 연산이면 X가 S에서 B보다 우선합니다. 과
(4.4) memory_order :: seq_cst 펜스 X가 A보다 먼저 발생하고 B가 memory_order :: sseq_cst 펜스 Y보다 먼저 발생하면 S에서 X가 Y보다 먼저 나옵니다.
atexit()
이 하나의 스레드와 exit()
다른 스레드 exit()
를 호출하는 경우, 동일한 스레드가 호출 한 경우와 결과가 다르기 때문에 이니셜 라이저가 소비 기반 종속성 만 수행하는 것만으로는 충분하지 않습니다 . 나의 오래된 대답 은이 차이에 관한 것입니다.
exit()
. 모든 스레드는 종료하여 전체 프로그램을 종료하거나 기본 스레드는 return
-ing으로 종료 할 수 있습니다 . atexit()
처리기를 호출 하고 수행중인 모든 스레드의 죽음을 초래합니다.
seq_cst
에, : 아토 31.4 주문과 일관성 4 . 이는 C ++ 17 n4659 표준 에 해당하지 않습니다 . 여기서 32.4-3 은 영향을받는 모든 위치에 대한 "이전에 발생하는"순서 및 수정 순서와 일치하는 seq_cst ops의 단일 전체 순서가 존재 함을 정의합니다 . "강하게"는 이후 초안에 추가되었습니다.