2012-08-12 3 views
1
을 설정

가능한 중복 :
Do I need to protect read access to an STL container in a multithreading environment?스레드 안전

경우 일부 스레드 읽기 : 설정하거나 :지도 할 때이 세트 또는 맵에 다른 스레드 쓰기, 무슨 일이 일어날 것? 예외?

이제 읽기 쓰기 잠금을 사용하지만 쓰기 작업이 자주 수행되지 않고 읽기 작업이 자주 발생하기 때문에 잠금을 제거하려고합니다.

+1

표준 컨테이너는 스레드 중 하나에 의해 수정되는 경우 스레드로부터 안전하지 않습니다. – Xeo

+0

@Xeo, 다른 쓰레드가 쓰일 때 한 쓰레드가 컨테이너를 읽을 때 어떻게 될까? 예외? – RomanKarpuk

+3

@RomanKarpuk 정의되지 않은 동작! – juanchopanza

답변

4

인종 조건이 발생합니다 : 수행 한 작업의 CPU 순서에 따라 매번 다른 결과가 나타납니다. 반복자가 무효화되면 (예 : 한 스레드에서 항목을 삭제하고 다른 스레드가 현재 유효하지 않은 메모리를 가리키는 반복자를 가짐) 다른 스레드에서 사용되는 경우 정의되지 않은 동작이 발생하므로 죽은 아기, 점토를주의하십시오 golems, 및 haunts, segfaults, 지연된 segfaults 및 런타임 충돌과 함께합니다.

C++ 11은 mutex 및 기타 스레딩 기능을 제공합니다. 필 요할 경우 읽기 및 쓰기 기능을 제공하십시오.

+0

"segfault를 사용할 때 구조를 변경시킬 수 있습니다. segfault가 생길 수 있습니다. 무효화 된 반복자가 가리키는 노드가 해제되어 다른 것으로 재 할당 된 경우 덜 명백한 버그가 발생할 수 있습니다. –

+0

버그의 가장 나쁜 아이는 segfault가 아니라 워크 플로우에서 후자가 많이 발생하는 것으로 보이는 버그입니다. 오류가 발생한 시점에서 오류가있을 때 감사하십시오. –

+0

@Loki : 워크 플로에서 나중에 충돌하는 것보다 더 나쁜 버그가 발생했습니다. 예를 들어, 충돌하지 않고 프로그램의 완전히 무관 한 부분이 잘못된 대답을 산출하게 만듭니다. 그러나 나는 버그의 프로그램이 뭔가 잘못한 것이 더 빠르다는 것을 분명히 동의한다. 따라서 오류가있는 라인의 세그 폴트는 일이 진행됨에 따라 꽤 좋습니다. –

0

표준 컨테이너 스레드로부터 안전하지 않습니다, 그들이 가지고있는 자바 의미에서 반복자 "빨리 실패"로 지정되지 않습니다. 그래서 보호되지 않은 동시 액세스로 잘못 될 수있는 적어도 두 가지가 있습니다 :

  1. 스레드가 반복자 나중에 다른 스레드를 무효화
  2. 한 정의되지 않은 동작을 수있는 컨테이너에 데이터 레이스 동일한 값을 사용 반복자. 이것은 정의되지 않은 동작이지만 반드시 데이터 레이스가 아니며 단일 스레드 프로그램에서도 버그가됩니다. 동일한 스레드가 여러 스레드에서 사용되는 경우 동일한 컨테이너에서 여러 반복자를 추적하는 것이 약간 쉽습니다.

프로그래머가 실패 할 때 C++ 철학이 "빠르게 성공"하고 결코 신경 쓰지 않을 수도 있습니다 .-). 따라서 많은 사용자에게 중복되는 기본 제공 잠금이 없습니다. 대신 당신의 문제 - 당신은 오히려 잠금이 설정 이없는 경우에도, 그들은이 프로그램 set을 사용 당신이 이제까지 쓴 다른 모든 프로그램을 늦추고 있다는 것을 불행보다,이 프로그램을 둔화되는 불행한 것이 동시에 액세스되었습니다.

쓰기 작업이 자주 수행되지 않고 읽기 작업이 자주 수행되지 않습니다.

정확하게 리더기 잠금 장치가 잘 작동해야하는 상황입니다. 상황을 개선 할 수있는 유일한 방법은 쓰기 작업을 "자주 사용하지 않음"에서 "사용하지 않음"으로 줄일 수있는 경우입니다. 그렇지 않을 수는 없습니다.