을 쓰는 데 쓰레드 안전성이없는 은 on Stackoverflow입니다. 그러나 실제로 그 의미는 무엇입니까? 일반 배열에 쓰기 가능한 데이터를 저장해야한다는 의미입니까?std :: vector를 쓰는 것에 대한 스레드 안전성 대 일반 배열
std::vector::push_back(element)
에 대한 동시 호출은 벡터의 크기 조정을 수반 할 수 있으므로 일관성없는 데이터 구조를 초래할 수 있습니다. 그러나 크기 조정이 관여하지 않습니다 이런 경우에 대해 무엇을 :
1) 배열을 사용하여 :
int data[n];
// initialize values here...
#pragma omp parallel for
for (int i = 0; i < n; ++i) {
data[i] += func(i);
}
2)`표준 : vector`` 사용 :
std::vector<int> data;
data.resize(n);
// initialize values here...
#pragma omp parallel for
for (int i = 0; i < n; ++i) {
data[i] += func(i);
}
을 첫 번째 구현이 스레드 안전성과 b) 성능면에서 두 번째 구현보다 실제로 더 낫습니까? 나는 C 스타일 배열에 익숙하지 않기 때문에 std :: vector를 선호한다.
편집 : 쓰기를 보호하기 위해 #pragma omp atomic update
을 삭제했습니다.
나는 대답을하기에 충분하지 않지만'std :: vector '의 다른 요소에 쓰는 것은 thread로부터 안전하다고 확신한다. – Angew
이 두 조각은 모두 동일한 스레드 안전합니다. –
"실제로 그게 무슨 뜻 이죠?" : 컨테이너가 동시 쓰기 ** 쓰기 **와 일치하는 경우 * 및 * 읽기 모두에 대해 독점적으로 래치되어야 함을 의미합니다. 모든 독자가 원하는 컨테이너를 두드 리도록 할 수 있지만, 쓰기 * 잠재력이 도입되는 즉시 모든 내기가 꺼 지므로 * 다른 모든 작성자가 아닌 모든 액세스를 래치 다운해야합니다. 단일 쓰기 다중 읽기 잠금은 btw를 위해 잘 작동합니다. – WhozCraig