2012-10-21 4 views
0

main() 함수에서 pthread_create을 호출하여 새 스레드를 만듭니다. 나는 텍스트 파일의 이름을 텍스트 파일로 전달하고 스레드는 텍스트 파일을 열고 줄 수를 계산 한 다음 그 수를 main()으로 반환합니다. 여기서 반환 된 숫자는 totalCount +=입니다.pthread를 사용할 때 왜 계산 스레드가 제대로 작동하지 않습니까?

다른 코드와 함께 텍스트 파일의 줄 수를 계산했기 때문에 스레드 함수가 제대로 작동한다는 것을 알고 있습니다. 루프를 사용하여 pthread_create 번 이상 호출하면 문제가 발생합니다. 하나의 파일을 계산할 때 totalCount이 정확하지만 두 개 이상의 파일을 열 때 totalCountmain()에 잘못되었습니다.

내 프로그램에서 이것이 원인 일 수 있습니다. 그것은 내 스레드 함수에 문제가 있습니까? 내 pthread_join? 나는이 질문이 코드 없이는 모호 할 수 있지만이 설명이 주어지면 어떤 생각을 할 수 있을지 알고있다.

+2

"이 질문이 코드 없이는 모호 할 수도 있지만이 설명이 주어지면 어떤 생각을 할 수 있습니까?" 참 모호합니다. 코드를 게시해야하는 것 같습니까? – Corbin

+3

경쟁 조건이 있거나 공유 리소스를 제대로 지키지 못했을 가능성이 있습니다. 코드를 보지 않고 문제가 무엇인지 말할 수 없습니다. – OmnipotentEntity

+0

하나 이상의 스레드를 작성한다고 가정 해보십시오. 모든 새로운 스레드를 pthread_t로 겹쳐 쓸 수 있다면 * 마지막 * join'ing 만 할 수 있습니까? 어떤 코드는 * LOT *을 더 쉽게 만들 것입니다. – WhozCraig

답변

0

코드는 모두 추측입니다. 그러나 확실히 totalCount +=은 스레드로부터 안전하지 않습니다. 원자 연동 연산 (예 : __sync_fetch_and_add)이 필요하거나 뮤텍스로 보호해야합니다.

0

재미로 어둠 속에서 촬영 -이 오류가 발생할 수있는 유일한 방법은 내부 회선 카운터 인 경우 - totalCount이 아니라 각 파일의 줄 수를 추적하는 것입니다. -는 전역 변수입니다. 각각의 pthread는 아마도 동일한 행 계산 기능을 호출 할 것이므로 다른 스레드가 업데이트 될 때 각 파일의 행 수가 잘못 증가합니다. 따라서 totalCount은 항상 실제 줄 수보다 크거나 작지 않을 것으로 예상됩니다.

관련 문제