2012-02-14 2 views
1

가능한 중복 :
question about STL thread-safe and STL debuggingC++ STL이 스레드 안전 컨테이너 집합을 제공하지 않는 이유는 무엇입니까?

나는 현재 C++를 사용하여 개발하는 프로젝트에 참여하고 있어요. 최근에 우리는 몇 가지 효율성을 얻기 위해 일부 자체 정의 된 스레드 안전 컨테이너를 일부 STL에 해당하는 컨테이너로 대체하는 것을 고려하고 있습니다.

그러나 잠시 후에 STL에 스레드 안전 컨테이너가 전혀 제공되지 않는다는 사실을 발견했습니다. 상당히 많은 놀라움이 있습니다. 어떤 이유가 있습니까?

+7

스레드는 C++에서 0x까지 포함되지 않았습니다. 따라서 컨테이너가 없습니다. – Anycorn

+0

비공식적으로, 대부분의 구현에서 '연산자 new'는 스레드로부터 안전합니다. 그래서 적어도 그 부분은 STL에서 스레드 안전성이 보장 될 수 있습니다. 또한, 모든 STL 컨테이너는 할당을위한 하나의'template' 인자를 가지고 있습니다. (일반적으로'std :: allocator'입니다.), 당신은 항상 당신 자신의 thread-safe 할당 메소드를 제공 할 수 있습니다. – iammilind

답변

2

스레드 안전성은 고도의 플랫폼 및 컴파일러 특정이기 때문에.

+1

왜 표준이 스레드 안전 요구 사항을 부과하지 못하게합니까? 릴리스 된 모든 플랫폼에 대해 표준 요구 사항을 준수하는 것은 구현의 책임입니다. –

5

아마 실제로 유용하지 않을 것이기 때문에 (다른 답변에서 @Luchian Grigore가 말한 것 외에). 개별 컨테이너 작업이 스레드로부터 안전하더라도 스레드 안전을 보장하기 위해 많은 작업을 수행해야합니다. 성능은 표준 라이브러리의 설계자들에게 더 중요한 설계 목표였다

if (!container.empty()) 
    container.pop(); 
+1

thread-safe 컨테이너는 대신'blocking_pop'과'pop_if_not_empty'를 제공합니다. – fredoverflow

4

표준 라이브러리 컨테이너 몇 가지 기본적인 스레드 안전을 제공 할 : 예를 들어,이 간단한 코드는 컨테이너 자체가 스레드 안전이 경우에도 경쟁 조건을 포함 용기는 안전보다.

모든 표준 라이브러리 컨테이너 보장 : 안전하지만
이이어야 한 작가 스레드가 경우
다중 동시가 같은 컨테이너에서 읽고, 그 다음 다른 작가 나 독자가 않습니다 더 스레드 안전 &이 없습니다.

표준 라이브러리 컨테이너는 주로 단일 스레드 환경에서 효율적으로 작동하도록 설계되었으며 기본 스레드 안전성 만 제공하면 동시 액세스가 필요없는 컨테이너의 전체 성능을 보장 할 수 있습니다.

기본 스레드 안전성은 사용자가 뮤텍스 또는 잠금을 사용하여 경쟁 조건을 피하기 위해 일종의 동기화 방법을 필요로합니다. 잠금 또는 다른 형식의 동기화는 일반적으로 비용이 많이 들고 따라서 불필요한 경우에는 피할 필요가 있습니다.

또한 표준 라이브러리 컨테이너에 의해 노출 된 인터페이스가 제공되므로 컨테이너 또는 컨테이너 사용자는 기본 컨테이너 작업을 잠금 획득 및 릴리스로 래핑하여 필요한 잠금을 제공하는 것이 쉽습니다 쓰레드 환경.

17.6.3.10 공유 객체 라이브러리 [res.on.objects]

: 모든 구현은 C++ 표준에 의해 지정된 다음과 같은 요구 사항을 준수


주 다른 스레드에서 표준 라이브러리 함수를 호출하면 데이터 경합이 발생할 수 있으므로 프로그램의 동작은 정의되지 않습니다. 이것이 발생할 수있는 조건은 17.6.4.8에 명시되어있다. [참고 : 스레드간에 공유되는 표준 라이브러리 유형의 객체를 수정하면 해당 유형의 객체가 데이터 경합없이 공유 가능하거나 사용자가 잠금 메커니즘을 제공하지 않는 한 정의되지 않은 동작이 발생할 위험이 있습니다.-end note]

1

C++ STL은 다른 모든 것들이 제공하는 스레드 안전성을 제공합니다. 객체가 한 스레드에서 액세스되지 않는 한 여러 스레드의 STL 컨테이너를 안전하게 사용할 수 있습니다 스레드가 수정 중이거나 수정 중일 수 있습니다.

0

문장에서 - 어렵 기 때문에.

스레드 안전 컨테이너는 특정 디자인이 필요합니다 (예 : 그들은 persistent data structures이어야합니다. 이러한 컨테이너는 기능/가비지 수집/이벤트 기반 환경에서 구현하기가 가장 쉽습니다. 어떤 C++이 아니야.

즉, 이들을 구현하면 사용자가 모든 자원 할당/할당 해제를 처리해야합니다. 그런 종류의 컬렉션을 가지고 포인트를 패배.

관련 문제