2012-03-01 2 views
12

표준 라이브러리의 컨테이너가 스레드로부터 안전하지 않다는 사실을 알고 있습니다. 그로 인해 컨테이너 유형이 std::list 인 동시에 하나 이상의 스레드가 동시에 액세스 할 수 없다고 생각 했었습니다 (일부는 컨테이너를 수정할 수 있음). 그러나 이제 눈에 보이는 것보다 더 많은 것이있는 것 같습니다. 더 미묘한 것, 분명하지 않은 것, 적어도 저에게는 적어도.표준 컨테이너를 멀티 스레드 응용 프로그램의 로컬 변수로 사용

void log(std::string msg, severity s, /*...*/) 
{ 
    return; //no code! 
} 

이 스레드 안전한가요 :

예를 들어, 값에 의해 첫 번째 인수 를 받아이 기능을 고려?

처음에는 함수 본체가 수정 가능한 리소스를 액세스하지 않으므로 스레드로부터 안전하므로 스레드로부터 안전합니다. 두 번째로 생각해 보면, 이런 함수를 호출 할 때, 첫번째 인자 인 타입이 std::string 인 객체가 생성 될 것이고,이 객체의 구조는 내부적으로는 std::allocator을 사용하기 때문에 thread-safe가 아니라고 생각합니다 , 나는 스레드로부터 안전하지 않다고 믿는다. 따라서 이러한 함수를 호출하는 것은 스레드로부터 안전하지 않습니다. 그러나 이것이 맞다면 이것에 대해서는 어떨까요 :

void f() 
{ 
    std::string msg = "message"; //is it thread-safe? it doesn't seem so! 
} 

나는 가고 있니? std::string (또는 내부적으로 std::allocator을 사용하는 컨테이너)을 멀티 스레드 프로그램에서 사용할 수 있습니까?

저는 공유 객체가 아니라 컨테이너를 로컬 변수로 사용합니다.

나는 Google을 검색하여 구체적인 대답이없는 많은 유사한 의구심을 발견했습니다. 나는 그의로 비슷한 문제에 직면

C++ 03과 C++ (11)를 모두 고려하시기 바랍니다.

+0

Nawaz - 그들이 C++의 구현에 대해 알고 있는지 알고 계십니까? http://www.sgi.com/tech/stl/Allocators.html 기본 할당자가 threadsafe라는 것을 나타냅니다. – Sid

+0

@Sid : 표준 라이브러리가 아닙니다. 그들은 stdlib이 지원하지 않는 많은 것을 지원합니다. – Nawaz

+0

알았어,주의 산만하게해서 미안해. – Sid

답변