thread 공유 자원중에~~

spinel1의 이미지

heap 영역도 포함되나요?

실제 테스트 해 본바에 의하면~~

main에서 malloc할당을 한 데이타의 주소를 thread의 argumant로 넘겼더니~

main과 thread간의 데이타 공유가 되더군요.

그런데 thread 내에서 얻은 주소로 free()를 해주면 메모리 해제가 안되요.

혹시 이유 아시는 님~~

그리고~~

혹시 생성된 스레드에서 새로 쓰레드를 여러개 만드는 로직은 잘못된 건가요??

spacelee의 이미지

free하면 메모리 해제가 안되는 건 어떤 상황을 보시고 그렇게 얘기하시는지..?
heap은 쓰레드간에 문제없이 공유됩니다. alloc, free 각각 아무 쓰레드에서나 해도 되구요.
단 OS의 메모리 관리 정책 상 메모리가 안줄어드는 것처럼 보이는 OS가 있기도 합니다. 리눅스랑 hp가 그랬던거 같은데..

권위를 의심할 것,어긋남을 존경할 것,자리잡기를 거부할 것,항상 자신을 재창조할 것 - MIT 미디어랩 -

spinel1의 이미지

void * doConnector( void * p )
{
    free(pParam);
    pParam = (param*)malloc(sizeof(param)*MAX_THREAD_CNT);
    printf("%p\n", pParam);   
    return 0;
}

int main()
{
    int index;
    pthread_t thr_id;

    pParam = (param*)malloc(sizeof(param)*MAX_THREAD_CNT);
    printf("%p\n", pParam);  
    pthread_create( &thr_id, 0, doConnector, 0);

    while(1)
        sleep(10);

    return 0;
}

두 함수에서 printf에 찍히는 값이...
틀립니다.
참고로 OS는 HP-UX 네요.

spacelee의 이미지

아..hp는 위에 말씀드린 Os 메모리 관리 상황말고 한가지 더 다른 특징이 있습니다.

thread간에 heap을 공유하는 경우 보통 race condition이 발생하기 때문에
alloc,free가 바틀넥이 되는 경우가 많습니다.
그래서 HP는 arena라는 개념을 사용해서 쓰레드들을 그룹핑해서 같은 그룹끼리만 같은 영역의 heap을 사용하게 합니다. 몇 개의 그룹인지는 간단하게 컨피규러블하구요. man malloc 해보셔서 _M_ARENA_OPTS을 찾아보세요.

아마 다르게 나오는 이유는 다른 ARENA를 써서 그렇거나,
OS의 메모리 관리 정책상의 이유거나 둘 중의 하나 일 것 같습니다.

권위를 의심할 것,어긋남을 존경할 것,자리잡기를 거부할 것,항상 자신을 재창조할 것 - MIT 미디어랩 -

spinel1의 이미지

답변 감사 드립니다.
자려고 누웠다가 궁금해서 일어나 다시 컴퓨터를 켰습니다.
어째뜬... 스레드에서 데이타 공유 목적으로 스레드를 쓰는것은 위험한 일인것 같네요.

spacelee의 이미지

위험한 일이긴 한데..^^
쓰레드 프로그래밍에서 피해가기는 힘든 부분 같습니다.

가능만 하다면 스택 메모리를 쓰시던가,
heap을 쓰시더라도 간단한 메모리 풀 개념을 이용해서 만드시 던가해서
메모리를 쓰실때 많이 생각해서 쓰시는게 중요합니다.

잘만 쓰시게 되면 독이 아니라 약이 됩니다.
쓰레드 프로그래밍에서 아주 유효하고, 유연한 그리고 꼭 필요한 부분입니다.

권위를 의심할 것,어긋남을 존경할 것,자리잡기를 거부할 것,항상 자신을 재창조할 것 - MIT 미디어랩 -