2009-11-26 5 views
1

여기에 조언이 필요합니다. STL 컨테이너의 작업 중 읽기 전용으로 간주되는 작업은 무엇입니까? 예를 들어, vector<int>을 취하면 기본 int 데이터를 변경하지 않는 연산은 읽기 전용입니까? 다중 스레드 프로그램을 작성 중이지만, 참조/포인터로 컨테이너를 전달하기에 스레드 안전성이 있는지는 확실하지 않습니다.STL 컨테이너의 읽기 전용 작업

사이에 동일한 규칙이 basic_string에도 적용됩니까? STL 컨테이너의 내부 메커니즘에 대한 이해를 빠르게 얻는 데 도움이되는 권장 리소스는 무엇입니까? 감사.

답변

1

방법, 컨테이너를 수정하지 않습니다 가능성을 const 선언했다.

다중 스레드 응용 프로그램에서 STL 컨테이너를 사용하는 경우 외부 동기화 메커니즘이 필요합니다. C++ 표준 라이브러리는 스레드로부터 안전하지 않으며 스레드 중 하나가 벡터 객체의 상태를 변경한다고 가정 할 때 동기화하지 않고 여러 스레드에서 사용하면 정의되지 않은 동작이 발생합니다.

+0

그 이유는 어떤 작업이 비 threadsafe인지 알아 내려고합니다. STL은 threadsafe가되도록 설계되지 않았지만 모든 컨테이너 작업에 멀티 스레드 문제가있는 것은 아니며 일부는 잠금/동기화가 필요하지 않을 수도 있습니다. 또는 공유 컨테이너의 모든 작업 (예 : 실적 고려 사항)에 동기화를 적용하는 것이 실용적입니까? – shiouming

+0

문제는 쓰레드가 안전한지 아닌지를 알 수 없다는 것입니다. 왜냐하면 표준에서는 그것을 언급하지 않기 때문입니다. 그러므로 가장 좋은 방법은 항상 어떤 형태의 동기화를 사용하는 것입니다. 스레드 안전 컨테이너를 지원하는 라이브러리를 찾을 수도 있습니다. 인텔 TBB는 오픈 소스입니다. – lkristjansen

+1

또는 구현 문서를 확인하십시오. 표준은 스레드 안전을 지정하지 않습니다. 명시 적으로 구현이이를 명시 할 수있는 가능성을 열어줍니다. thread-safe C++ 구현을 사용하는 것은 인텔 TBB로 마이그레이션하는 것이 훨씬 더 작은 단계입니다. – MSalters

1

스탠다드는 그런데 용기의 안전성에 대해서는 아무 말도하지 않습니다. 그러나 const으로 표시된 방법은 컨테이너를 수정하지 않도록 보장합니다. *

스레드가 동시에 데이터를 읽고 쓰는 경우 해당 스레드를 동기화해야합니다.

** 논리적으로 수정됩니다. 다른 컨테이너는 모르지만 const 메서드에서는 변경할 수있는 멤버가 변경 될 수 있습니다. *

+0

모든 Microsoft 컨테이너에는 반복기가 만들어 지거나 소멸 될 때 컨테이너를 수정하는 선택적 검사기가 있습니다 (기본적으로). 참조 http://msdn.microsoft.com/en-us/library/aa985965%28VS.80%29.aspx –

0

stl 컨테이너에서 작업하는 동안 다중 스레드 스레딩 환경에서 pthread 읽기 - 쓰기 잠금을 사용합니다. 그들은 매우 효율적입니다. pthread를 읽어 기입의 잠금에 대한 참조 : 당신이 확신 할 수는 없지만

Pthread Read Write Locks - Yolinux

0

표준에서 언급 된 유일한 것은

  • 여러 독자가 스레드 안전 (duhhhhhh) 다른 용기에
  • 여러 작가 ... 스레드 duhh 다시 (안전되지만이다 작은 하나 :) 즉, 정적 멤버를 구현하여 스레드 안전성을 손상시킬 수있는 수정을 할 수 없음을 의미합니다.