2009-04-28 2 views
12

곧 공유 메모리를 사용하는 메쉬 세밀화 알고리즘의 병렬 버전 작업을 시작하겠습니다.linux와 gcc의 새로운 C++ 연산자 안정성 4

대학 교수는 컴파일러도 stl도 스레드를 인식하지 못하기 때문에 스레드 안전성에 대해 매우주의해야한다고 지적했습니다.

나는이 질문을 검색하고 대답은 컴파일러에 의존 (일부는 로 시도 다소 스레드 인식) 및 플랫폼 이서 (컴파일러가 사용하는 시스템 호출 스레드 안전하거나하지 않은 경우).

그래서 리눅스에서 gcc 4 컴파일러는 새로운 연산자에 대한 스레드 안전 코드를 생성합니까?

그렇지 않은 경우이 문제를 극복하기위한 가장 좋은 방법은 무엇입니까 ? 새 통화에 대한 각 통화를 잠글 수 있습니까?

답변

16

스레드를 지원하지만 스레드 안전성이없는 플랫폼을 찾으려면 매우 열심히 노력해야합니다. new. 사실 스레드 안전성이 new (및 malloc) 인 이유는 너무 느립니다.

반면에 스레드 안전 STL을 원하면 스레드 인식 컨테이너가있는 Intel TBB을 고려할 수 있습니다 (모든 작업이 스레드로부터 안전하지는 않지만).

8

일반적으로 new 연산자는 스레드로부터 안전합니다. 그러나 STL 및 표준 라이브러리에 대한 호출에 대한 스레드 안전성 보장은 표준에 의해 관리됩니다. 이는 스레드가 인식하지 못함을 의미하지는 않으며 매우 잘 정의 된 보증을하는 경향이 있습니다 특정 작업에 대한 스레드 안전성. 예를 들어 읽기 전용 방식으로 목록을 반복하는 것은 여러 독자가 쓰레드에 대해 안전하지만 목록을 반복하고 업데이트하는 것은 아닙니다. 문서를 읽고 다양한 보증이 무엇인지 확인해야합니다. 단점은 그다지 부담스럽지 않습니다.

+0

어떤 경우 새 연산자가 스레드로부터 안전하지 않습니까? 그 점에 대해 걱정해야합니까 아니면 그냥 사용해야합니까? – Gaston

+1

그건 컴파일러 제공 업체 나 구현에 달린 것입니다. 예를 들어 비주얼 C++에서는 멀티 스레드 표준 라이브러리 또는 단일 스레드 라이브러리 중에서 선택할 수 있습니다. 요즘 거의 관심을 두지 않는 모든 것들이 다중 스레드 라이브러리. –

2

내가 사용하지 않은 개념에 대해 이야기하고 있지만 공유 메모리를 사용하는 경우 POD 유형 만 사용하고 새로운 배치를 사용해야한다는 사실을 언급해야합니다.

둘째, 공유 메모리를 Linux 시스템에서 사용하는 것으로 일반적으로 이해되는 경우 공유 메모리를 통신으로 사용하여 스레드가 아니라 메모리를 할당하고 '할 일'을하는 여러 프로세스를 사용할 수 있습니다. 층. 이 경우 응용 프로그램과 라이브러리의 스레드 안전성은 중요하지 않습니다. 그러나 중요한 점은 공유 메모리 할당을 사용하는 스레드 안전성입니다. 이것은 많은 스레드를 가진 하나의 프로세스를 실행하는 것과는 다른 상황입니다.이 경우 새 연산자의 스레드 안전성에 대해 질문하는 것이 유효한 관심사이고, 그렇지 않은 경우 배치 new에 의해 처리되거나 자체 할당자를 정의 할 수 있습니다.

1

글쎄, 내 질문에 대한 답은 확실하지 않다. 단지 Google이 고성능 멀티 스레드 malloc을 구현 한 것으로 밝혀졌다.

따라서 구현이 스레드로부터 안전한지 여부가 의심스러운 경우 Google Performance Tools을 사용해야합니다.