2011-12-26 2 views
3

pthread_create를 사용하여 스레드를 생성하려고 할 때 EAGAIN이 있습니다. 그러나 내가 확인한 바에 따르면 스레드가 제대로 종료 된 것 같습니다.pthread_create와 EAGAIN

pthread_create를 사용하여 스레드를 만들려고 할 때 EAGAIN을주는 OS를 결정하는 것은 무엇입니까? 닫히지 않은 소켓/파일 핸들이이 EAGAIN의 원인이 될 수 있습니다 (즉, 동일한 리소스 공간을 공유 할 수 있습니까?).

그리고 마지막으로 리소스 사용을 검사 할 수있는 도구가 있습니까? 아니면 그 당시에 얼마나 많은 pthread 개체가 활성화되어 있는지 확인할 수있는 기능이 있습니까?

답변

7

좋아요, 답을 찾았습니다. pthread_exit 또는 pthread_cancel이 호출 되더라도 부모 프로세스는 여전히 pthread_join을 호출하여 pthread ID를 해제해야합니다.이 ID는 다시 재활용 가능하게됩니다.

끝에 pthread_join (tid, NULL)을 넣으면 트릭을 만들었습니다.

편집 (는 waitpid 아니라 pthread_join을하지 않은) 부모 프로세스 중 하나가 pthread_join을()를 호출하면 내 관찰 사항에 따라

+5

스레드를 기다리는 데 관심이 없다면, 자원을 해제하는 것과 관련하여'pthread_detach()'는 같은 작업을 수행해야합니다. –

3

실제로 EAGAIN은 거의 항상 프로세스의 메모리 부족과 관련이 있습니다. 종종 이것은 pthread_attr_setstacksize()으로 조정할 수있는 스레드에 할당 된 스택 크기와 관련이 있습니다. 그러나 실행할 수있는 스레드 수에 대한 프로세스 제한이 있습니다. RLIMIT_NPROC를 첫 번째 매개 변수로 사용하여 getrlimit()으로 하드 및 소프트 제한을 쿼리 할 수 ​​있습니다.

스레드가 있는지, 그 번호가 있는지, 죽었는지 살아 있는지 등등에 관한 많은 질문들이 여기에 있습니다. 간단히 말해서, 그것들을 추적하는 가장 쉬운 방법은 몇 가지 메커니즘을 통해 직접 수행하는 것입니다. 코드는 전역 카운터 (뮤텍스로 보호 됨) 또는 더 정교한 항목을 증가 및 감소시키는 것처럼 간단 할 수 있습니다.

오픈 소켓이나 다른 파일 설명자로 인해 pthread_create()이 실패하지 않아야합니다. 디스크립터의 최대 값에 도달했다면 새로운 스레드를 생성하기 전에 이미 실패했을 것이며 새로운 스레드는 이미 성공적으로 생성되어 더 많은 것을 열어야하므로 EAGAIN으로 실패 할 수 없었을 것이다.

1

, 냉장 프로세스가 pthread_exit를 호출하여 스레드를 해제하려고() 또는 pthread_cancel() 그러면 시스템이 해당 스레드를 적절하게 해제 할 수 없습니다. 이 경우, pthread_detach()가 pthread_create() 호출이 성공한 직후에 호출되면,이 문제는 해결되었습니다. 스냅 샷은 여기 -

err = pthread_create(&(receiveThread), NULL, &receiver, temp); 
if (err != 0) 
{ 
MyPrintf("\nCan't create thread Reason : %s\n ",(err==EAGAIN)?"EAGAUIN":(err==EINVAL)?"EINVAL":(err==EPERM)?"EPERM":"UNKNOWN"); 
    free(temp); 
} 
else 
{ 
    threadnumber++; 
    MyPrintf("Count: %d Thread ID: %u\n",threadnumber,receiveThread); 
    pthread_detach(receiveThread); 
} 
0

또 다른 잠재적 인 원인 :이 문제 (pthread_createEAGAIN) I가 pthread_attr_tpthread_attr_init 전화를 분실했기 때문에 나는 내 스레드를 초기화하는 한을 얻고 있었다.

관련 문제