programing

pthread_return 대 반환

skycolor 2023. 6. 16. 21:36
반응형

pthread_return 대 반환

다음과 같이 결합 가능한 pthreadrunner 기능이 정의되어 있습니다.

void *sumOfProducts(void *param)
{
...
pthread_exit(0);
}

이 스레드는 메인 스레드와 연결되어야 합니다.

Valgrind를 통해 프로그램을 실행할 때마다 다음과 같은 누출이 발생했습니다.

LEAK SUMMARY:
   definitely lost: 0 bytes in 0 blocks
   indirectly lost: 0 bytes in 0 blocks
     possibly lost: 0 bytes in 0 blocks
   still reachable: 968 bytes in 5 blocks
        suppressed: 0 bytes in 0 blocks

ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 15 from 10)

man 페이지에서 pthreads를 확인했습니다. pthreads는 다음과 같습니다.

  The new thread terminates in one of the following ways:

   * It  calls  pthread_exit(3),  specifying  an exit status value that is
     available  to  another  thread  in  the  same  process   that   calls
     pthread_join(3).

   * It  returns  from  start_routine().   This  is  equivalent to calling
     pthread_exit(3) with the value supplied in the return statement.

   * It is canceled (see pthread_cancel(3)).

   * Any of the threads in the process calls exit(3), or the  main  thread
     performs  a  return  from main().  This causes the termination of all
     threads in the process.

기적적으로 pthread_exit()를 return 문으로 교체했더니 누수가 사라졌습니다.

return(NULL);

저의 실제 질문은 세 갈래입니다.

  1. 누가 왜 반품 명세서에 누수가 없는지 설명해 줄 수 있습니까?
  2. 스레드에서 종료하는 것과 관련하여 두 문장 사이에 근본적인 차이가 있습니까?
  3. 그렇다면, 언제 어느 것이 다른 것보다 더 선호되어야 합니까?

다음의 최소 테스트 사례는 사용자가 설명한 동작을 보여줍니다.

#include <pthread.h>
#include <unistd.h>

void *app1(void *x)
{
    sleep(1);
    pthread_exit(0);
}

int main()
{
    pthread_t t1;

    pthread_create(&t1, NULL, app1, NULL);
    pthread_join(t1, NULL);

    return 0;
}

valgrind --leak-check=full --show-reachable=yes는 에서 개함수할서 5블보다니여에서 의 블록을 .pthread_exit()자유롭지만 프로세스 종료 시에도 도달할 수 있습니다.에 약에만.pthread_exit(0);는 대됨체로 대체됩니다.return 0;5개의 블록이 할당되지 않았습니다.

그러나 많은 수의 스레드를 만들고 결합하는 것을 테스트하면 종료 시 사용 중인 사용 가능한 메모리의 양이 증가하지 않음을 알 수 있습니다.이것은, 그리고 여전히 도달할 수 있다는 사실은 여러분이 glibc 구현의 이상한 점을 보고 있다는 것을 나타냅니다.여러 glibc 함수는 메모리를 할당합니다.malloc()프로스 기간동유상지다 니됩태로. 종료될 때 이 프로세스가 입니다. - 입니다. glibc 는프 있때 프 해 알 cpu메 해사않애이낭시제종하모려를리료지다쓰이고클니습의일비스세로어에차세문로스가기것피체을고된다는수명세남의은안당할된▁cpu▁at▁exitg▁memory▁g▁this,해프li▁isli사애

아직 관심이 있으신지 모르겠지만, 현재 비슷한 상황을 디버깅하고 있습니다.를 사용하는 pthread_exitValgrind가 도달 가능한 블록을 보고하도록 합니다.그 이유는 여기서 꽤 잘 설명되는 것 같습니다.

https://bugzilla.redhat.com/show_bug.cgi?id=483821

은 으그것은로인 것처럼 보입니다.pthread_exit원인이 됩니다.dlopen프로세스가 종료될 때 명시적으로 정리되지 않습니다.

혹시 실제로 C++을 사용하고 계십니까?하기 - 은 명하게하위해 - 끝납니다..c장확, 그고당그것컴있파고습다니하일을신은리▁로 컴파일하는 입니다.gcc,것은 아니다.g++?

함수가 반환될 때 자동으로 정리될 것으로 예상되는 리소스를 할당하는 것이 함수일 가능성이 높습니다. C는 "C++"와 같습니다.std::vector또는std::string이렇게 하면, 당신이 전화하면 그들의 파괴자들은 아마 실행되지 않을 것입니다.pthread_exit그냥 돌아오면 깨끗이 치워질 겁니다

제가 선호하는 것은 다음과 같은 낮은 수준의 API를 피하는 것입니다.pthread_exit가능한 경우 항상 스레드 기능에서 복귀합니다.그들은 동등하다는 것을 제외하고는.pthread_exit사용 중인 언어를 우회하는 디인터페이스 흐름 제어 구조입니다.returnDoesn't.

exit()를 호출하고 pthread_exit()을 호출하면 자동으로 할당된 변수가 남게 됩니다.제대로 풀려면 되돌아오거나 던져야 합니다.

C++ 밸브 그리드당 STL 문자열에서 발생할 수 있는 누출:

@클레임: 저는 그 문서가 어디에서 제가 틀렸다고 말하는지 보지 않지만, 만약 그렇다면 그것은 틀렸습니다.C++ 표준(§ 18.3/8)을 인용하자면: "자동 물체는 출구()를 호출한 결과로 파괴되지 않습니다." – James McNellis '10년 9월 10일 19:11

"pthread_exit(0)" 대신 "return 0"을 하는 것이 당신의 문제(그리고 나의 문제)를 해결하는 것처럼 보였기 때문입니다.감사합니다), 저는 두 사람의 행동이 비슷하다고 생각합니다.

Valgrind가 pthread_exit 변수를 추적하는 것은 어렵기 때문에 pthread_exit에서는 여전히 도달 가능한 태그로 메모리 누수를 표시하지만 반환되는 경우는 그렇지 않습니다.

저는 Valgrind가 결합 가능한 스레드 상태에 할당된 스토리지를 추적하는 데 어려움을 겪은 경험이 있습니다.(이것은 카페가 가리키는 방향과 같습니다.)

당신은 항상 값을 반환하는 것처럼 보이기 때문입니다.0애플리케이션의 관점에서 스레드를 결합해야 할 필요가 있다고 생각합니다.처음부터 분리하여 실행하는 것을 고려하면 해당 메모리의 할당이 방지됩니다.

단점은 다음 중 하나가 있다는 것입니다.

  1. 마지막에 자신의 장벽을 구현하기 위해.main사전에 스레드 수를 알고 있는 경우 단순하게 정적으로 할당됨pthread_barrier할 수 있습니다.
  2. 아니면 당신을 떠나는 것.main와 함께pthread_exit아직 완료되지 않은 나머지 실행 중인 스레드를 죽이지 않도록 합니다.

언급URL : https://stackoverflow.com/questions/3844678/pthread-exit-vs-return

반응형