정말 이상한 상황이 있습니다. char * 문자열과 관련된 모든 핵심적인 메모리를 사용하여 Linux 멀티 스레딩 C 응용 프로그램을 만들고 있습니다. 정말 이상한 위치에 머물러 있습니다.이상한 C 프로그램 동작
기본적으로 POSIX 스레드를 사용하여 2 차원 char 배열을 읽고 쓰고 있지만 예외적 인 오류가 발생합니다. 독자는 개별적으로 액세스하는 것에 대해 광범위한 테스트를 수행했으며, 다른 스레드의 데이터를 읽지 않고 다른 사람에게 쓸 수는 없다는 것을 알았습니다. 배열과 함께 작동하는 마지막 스레드가 배열의 일부를 변경하면 배열의 마지막 몇 문자가 변경되어 거기에 문자가 들어갈 가능성이 있습니다. 주로 검은 다이아몬드 물음표로 인쇄되는 것들.
저는 valgrind와 GDB를 사용하며 실제로 도움이되지 않습니다. 내가 말할 수있는 한 모두 작동해야합니다. Valgrind는 내가 모든 것을 자유롭게하지 않는다고 말한다.
나는 그 모든 것이 상당히 바람직하지 않다고 생각하지만, 이상하게 여기는 곳이있다. 전기 울타리로 프로그램을 컴파일하면 모든 작품이이다. Valgrind는 내가 모든 것을 해방하고 있으며 메모리 오류가 전혀 없다고 생각합니다. 그것은 절대적으로 완벽하게 작동합니다!
내 질문에 내 전기가 울타리로 컴파일 할 때 내 프로그램이 제대로 작동하는 이유는 무엇입니까?
(또한 단계 100 % "스레드 안전"코드를 확인하기 위해 수행해야 할 어떤 측면 질문?로) 그것은 당신이 당신의 데이터 구조를 부수고있는 것처럼 소리
심령 디버깅 요청? 만약 누군가가 그 이유를 정확하게 추측하면, 그들은 많은 상향 조율을받을 자격이 있습니다 ;-) 처음에는 다른 스레드의 데이터를 읽지 않고 다른 사람들에게 쓰는 것을 허용하지 않고 " 배열과 함께 작동하는 마지막 스레드 "를 참조하십시오. 아마 당신은 비공유 배열의 요소를 의도하지만, 그 중 일부는 실수로 발생합니다. 아마도 스레드 중 하나가 배열의 "일부"를 오버런하여 다른 스레드와 경쟁 상태가 될 수 있습니다. 아마도 전기 담장은 우연히 경기를 피하면서 타이밍을 미묘하게 바꿉니다. –
버그는 42 행에 있습니다. 스레드 안전 코드는 테스트가 아닌 디자인 결과입니다. 솔직히, 당신이하는 일 중 적어도 일부를 보지 않고, 유용한 제안을하는 데 많은 것을 할애하는 것은 불가능합니다. –
코드를 자랑스럽게 생각하는 것은 그것에 대해 질문 할 때 원천 징수하지 않는 것이 좋습니다. –