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 미디어랩 -

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.