STL 벡터를 반복하고 값을 읽는 중입니다. 이 벡터를 변경할 수있는 또 다른 스레드가 있습니다. 이제 다른 스레드가 벡터에서 요소를 삽입하거나 제거하고 요소를 제거하면 반복기가 무효화됩니다. 관련된 자물쇠는 사용하지 않습니다. 내가 이터레이터 (접근법 2) 대신 인덱스 (접근법 1)를 통해 컨테이너에 액세스하면 스레드를 안전하게 만들 수 있습니까? 실적은 어떻습니까?C++ STL 벡터 반복자와 인덱스 액세스 및 스레드 안전성
struct A{int i; int j;};
접근법 1 :
size_t s = v.size();//v contains pointers to objects of type A
for(size_t i = 0; i < s; ++i)
{
A* ptr = v[i];
ptr->i++;
}
접근법 2 :
std::vector<A*>::iterator begin = v.begin();
std::vector<A*>::iterator end = v.end();
for(std::vector<A*>::iterator it = begin; it != end; ++it)
{
A* ptr = *it;
ptr->i++:
}
+1 C/C++ 독립 라이브러리의 아무 것도 스레드로부터 안전하지 않은 것으로 간주됩니다. 그러나 POSIX 정의 함수는 thread-safe로 정의됩니다. – sj755
@ seljuq70 : 진술이 잘못되었습니다. 가장 최근의 stnadards 업데이트가 발표되기 전에 사실 이었지만 C 및 C++ 모두 특정 스레드 안전 보장을 제공합니다. 그것들은 여러분이 원했던 것이 아닐지도 모르지만 라이브러리 구조가 쓰레드에 안전하지 않다는 것을 의미하지는 않습니다. 다양한 클래스는 실제로 많은 사람들이 스레드로부터 안전하다고 잘못 해석 한 것처럼 보이는 모니터가 없습니다 (대부분의 경우). –
@ DietmarKühl 내 노트를보고 나면, 네가 절대적으로 옳은 것처럼 보인다. 거의 모든 시스템 및 라이브러리 함수는 스레드로부터 안전합니다. 또한 모든 POSIX 함수가 스레드로부터 안전하다는 점에 틀 렸습니다. 예를 들어, readdir과 strerror는 thread-safe로 정의되지 않습니다. – sj755