valgrind를 사용하여 멀티 스레드 소켓 프로그램을 실행하고 있습니다. 클라이언트는 TCP를 통해 서버에 요청을 보낸 다음 부울을 기다리며 대기합니다. 부울은 서버의 응답을 처리하는 콜백 함수가 호출 될 때 설정됩니다. 응답이 수신되면 (그리고 부울 플래그가 설정된 경우) 서버는 다시 요청을 보내고 반복적으로 반복합니다.멀티 스레드 소켓 프로그램에서 valgrind가 멈 춥니 다
공유 변수 (부울)에 대한 액세스 권한이 없으면 스레딩 문제가 발생할 수 있지만 pthread 뮤텍스를 사용해 보았습니다. 프로그램이 약 20 % 속도가 느려집니다 (속도가 중요합니다). 단일 주기로 수행 할 수 있기 때문에 공유 부울 변수에 쓰는 것이 좋다고 확신합니다.
프로그램이 valgrind 외부에서 정상적으로 실행되지만 valgrind를 사용하여 실행하면 프로그램이 멈추는 경우가 많습니다. 나는 프로그램을 밤새껏 운영하기 위해 남겨 뒀다 .. 보통 그것은 완료하는 데 몇 초가 걸린다. 그래서 나는 그것이 프로그램을 끝내기에 충분히 오랫동안 기다리지 않는 경우라고 생각하지 않는다. 스레딩은 오픈 소스 엔진 프레임 워크 (빠른 수정)에서 관리하므로 스레드 작성/관리 방법에 문제가 있다고 생각하지 않습니다.
누가 멀티 스레드 프로그램/바쁜 대기 루프/소켓 통신 (또는 이들의 조합) 주위에 valgrind와 어떤 문제를 알고 있습니까?
공유 부울 변수에서 busy-waiting은 "하나의 주기로 완료"되지 않습니다. 루프 반복마다 여러 주기로 이루어지며, 네트워크에서 TCP 왕복으로 대기중인 경우 루프는 수십억 번 반복 될 가능성이 있습니다 (따라서 다른 곳에서 더 잘 사용되었을 수있는 수십억 개의 CPU 사이클을 낭비합니다). 언급 한 것 중 하나보다 나은 솔루션은 조건 변수를 기다리는 것이고, 콜백 함수가 데이터가 준비되면 스레드를 깨우기 위해 조건 변수에 신호를 보내도록하는 것입니다. –
나는 부울 변수에 대한 쓰기가 하나의주기 (전체 대기 중 대기 프로세스가 아님)로 완료되었다고 말했습니다. 즉, 부울 변수에 대한 쓰기가 원자 적으로 수행되어야한다고 말했을 것입니다 (캐시 미스 (cache miss) 등이 단일 CPU주기를 지나서 단일 바이트의 쓰기를 푸시 할 수 있음) – Taras
Jeremy가 말한 바 - busy wait는 나쁜 생각입니다. 더 느리고 느릴 가능성은 희박합니다. – BillT