다음은 내 상황에 대한 설명입니다. 우리 제품에서 버그를 처리해야합니다. 스레드는 joinable
으로 생성되고 작업을 완료해야하며 아무도 그 스레드에 대해 pthread_join()
을 호출하지 않습니다. 그래서 스레드 (기본적으로) 조인 속성으로 생성 및 종료하기 전에 다음 코드를 호출된다pthread_detach()는 64 비트 Linux에서 SIGSEGV를 발생시킵니다
{ pthread_detach(pthread_self()); pthread_exit(NULL); }
그것은 내가 만난 모든 32 비트 리눅스 배포판에 매력처럼 작동하지만 64 비트 배포판에 SIGSEGV
원인 (우분투 13.04 x86_64 및 데비안). 나는 슬랙웨어로 시도하지 않았다. 여기에 핵심입니다 :이 버그를 수정하는 방법을 알아 냈
Core was generated by `IsaVM -s=1 -PrjPath="/home/taf/Linux_Fov_540148/Cmds" -stgMode=1 -PR -Failover'.
Program terminated with signal 11, Segmentation fault.
#0 0x00007f5911a7c009 in pthread_detach() from /lib/x86_64-linux-gnu/libpthread.so.0
(gdb) bt
#0 0x00007f5911a7c009 in pthread_detach() from /lib/x86_64-linux-gnu/libpthread.so.0
#1 0x000000000041310d in _kerCltDownloadThr (StartParams=0x6bfce0 <RESFOV>) at ./dker0clt.c:1258
#2 0x00007f5911a7ae9a in start_thread() from /lib/x86_64-linux-gnu/libpthread.so.0
#3 0x00007f591159f3fd in clone() from /lib/x86_64-linux-gnu/libc.so.6
#4 0x0000000000000000 in ??()
-가 생성되기 전에 스레드가 나는 설정 CREATE_DETACHABLE 속성 (pthread_attr_setdetachstate()
와)과 예상대로 작동합니다.
하지만 내 질문 -이 코드를 호출하는 것이 범죄입니까?
{ pthread_detach(pthread_self()); pthread_exit(NULL); }
는 pthread_detach()
비동기 호출 후에 무언가를 수행하고 그 pthread_exit()
을 문제를 가져 오는 원인은? 그러나 충돌 지점은 pthread_detach()
이 아니며 pthread_exit()
입니다! 나는이 충돌에 대한 이유를 완전히 이해하지 못한다! 왜 32 비트에서 작동합니까? pthread
구현 어딘가에 경쟁 조건이 있습니까?
pthread_join()
이 스레드에 대해 호출되지 않았습니다.
미리 아이디어를 제공해 주셔서 감사합니다.
문제가 gcc에있는 것으로 의심됩니다. 소스 코드를 게시하십시오. –
나는 이것을 할 수 없다, 나는 NDA하에있다. 아마도 pthread_self()가 호출 된 문제 함수 만 게시 할 수 있습니다. 여기에 비공개 메시지를 보낼 수있는 방법이 있습니까? –
당신이 분해 한 기능. 하지만 난 당신이 자신의 대답을 받아 볼 수 있도록, 당신은 문제를 해결해야하고 더 이상 도움을 필요로하지 말아야합니다) –