2012-06-04 3 views
0

다른 스레드의 데이터 부분을 읽은 후 그 안에 패턴을 찾는 프로그램을 작성하고 있습니다.C 프로그램의 Linux POSIX 취소 스레드에서 실패합니다

하지만 그 전에 (문제가 아래 코드에서 발생 함) 스레드가 제대로 취소되는지 확인하고 싶었습니다. 그게 내가 붙어있는 곳이야. 이 오류를 볼 시간이 걸리지 만 (때로는 40 시간) 내 프로그램을 시작 기본적 후에는 마지막 스레드가 취소 기다리고 ... 메인 스레드

while (alive_threads) { //never ends, because alive_threads==1, but pthread_cleanup_pop should make sure that all canceling threads reduces counter and as a result reduce it to 0 
usleep(1000); 
} 

에 while 루프에 달려 있습니다.

코드는 여기에 있습니다 : 나는 또한 내가에서 읽고 있어요 파일의 내용을 제공 한 http://pastebin.com/VqRrhXPD

.

열기 :

./a.out 20 test.txt 40 clean 

20 -number of threads 

40 -portion of data 

답변

3

당신은 어떤 메모리 동기화없이 전역 변수 alive_threads을 수정. 이렇게하면 정의되지 않은 동작이 호출됩니다. 모든 경우에, 그것은 감소의 일부를 잃게 만든다.

+0

hm, 답장을위한 thx. 그러나 그들이 어떻게 될 수 있습니까? 필자가 감소하는 곳에서 pop 함수 내에서만 다른 뮤텍스를 생성하면 문제를 해결할 수 있습니까? – aragornsql

+0

두 스레드가 동시에 읽기/수정/쓰기를 수행하면이 값은 손실 될 수 있습니다. 뮤텍스로 공유 객체를 보호해야합니다. –

+0

또는 연동 작업 –

관련 문제