가능한 중복 :
Do I need to protect read access to an STL container in a multithreading environment?스레드 안전
경우 일부 스레드 읽기 : 설정하거나 :지도 할 때이 세트 또는 맵에 다른 스레드 쓰기, 무슨 일이 일어날 것? 예외?
이제 읽기 쓰기 잠금을 사용하지만 쓰기 작업이 자주 수행되지 않고 읽기 작업이 자주 발생하기 때문에 잠금을 제거하려고합니다.
가능한 중복 :
Do I need to protect read access to an STL container in a multithreading environment?스레드 안전
경우 일부 스레드 읽기 : 설정하거나 :지도 할 때이 세트 또는 맵에 다른 스레드 쓰기, 무슨 일이 일어날 것? 예외?
이제 읽기 쓰기 잠금을 사용하지만 쓰기 작업이 자주 수행되지 않고 읽기 작업이 자주 발생하기 때문에 잠금을 제거하려고합니다.
인종 조건이 발생합니다 : 수행 한 작업의 CPU 순서에 따라 매번 다른 결과가 나타납니다. 반복자가 무효화되면 (예 : 한 스레드에서 항목을 삭제하고 다른 스레드가 현재 유효하지 않은 메모리를 가리키는 반복자를 가짐) 다른 스레드에서 사용되는 경우 정의되지 않은 동작이 발생하므로 죽은 아기, 점토를주의하십시오 golems, 및 haunts, segfaults, 지연된 segfaults 및 런타임 충돌과 함께합니다.
C++ 11은 mutex
및 기타 스레딩 기능을 제공합니다. 필 요할 경우 읽기 및 쓰기 기능을 제공하십시오.
"segfault를 사용할 때 구조를 변경시킬 수 있습니다. segfault가 생길 수 있습니다. 무효화 된 반복자가 가리키는 노드가 해제되어 다른 것으로 재 할당 된 경우 덜 명백한 버그가 발생할 수 있습니다. –
버그의 가장 나쁜 아이는 segfault가 아니라 워크 플로우에서 후자가 많이 발생하는 것으로 보이는 버그입니다. 오류가 발생한 시점에서 오류가있을 때 감사하십시오. –
@Loki : 워크 플로에서 나중에 충돌하는 것보다 더 나쁜 버그가 발생했습니다. 예를 들어, 충돌하지 않고 프로그램의 완전히 무관 한 부분이 잘못된 대답을 산출하게 만듭니다. 그러나 나는 버그의 프로그램이 뭔가 잘못한 것이 더 빠르다는 것을 분명히 동의한다. 따라서 오류가있는 라인의 세그 폴트는 일이 진행됨에 따라 꽤 좋습니다. –
뮤텍스, 잠금 .... brrr 무료 잠금 컨테이너를 사용하려고합니다. 일명 TBB 을 "빌딩 블록 스레딩"예를 들어 인텔 http://threadingbuildingblocks.org/files/documentation/a00130.html
표준 컨테이너 스레드로부터 안전하지 않습니다, 그들이 가지고있는 자바 의미에서 반복자 "빨리 실패"로 지정되지 않습니다. 그래서 보호되지 않은 동시 액세스로 잘못 될 수있는 적어도 두 가지가 있습니다 :
프로그래머가 실패 할 때 C++ 철학이 "빠르게 성공"하고 결코 신경 쓰지 않을 수도 있습니다 .-). 따라서 많은 사용자에게 중복되는 기본 제공 잠금이 없습니다. 대신 당신의 문제 - 당신은 오히려 잠금이 설정 이없는 경우에도, 그들은이 프로그램 set
을 사용 당신이 이제까지 쓴 다른 모든 프로그램을 늦추고 있다는 것을 불행보다,이 프로그램을 둔화되는 불행한 것이 동시에 액세스되었습니다.
쓰기 작업이 자주 수행되지 않고 읽기 작업이 자주 수행되지 않습니다.
정확하게 리더기 잠금 장치가 잘 작동해야하는 상황입니다. 상황을 개선 할 수있는 유일한 방법은 쓰기 작업을 "자주 사용하지 않음"에서 "사용하지 않음"으로 줄일 수있는 경우입니다. 그렇지 않을 수는 없습니다.
표준 컨테이너는 스레드 중 하나에 의해 수정되는 경우 스레드로부터 안전하지 않습니다. – Xeo
@Xeo, 다른 쓰레드가 쓰일 때 한 쓰레드가 컨테이너를 읽을 때 어떻게 될까? 예외? – RomanKarpuk
@RomanKarpuk 정의되지 않은 동작! – juanchopanza