pthread_cleanup_push(3)
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
<a href="/modules/moniwiki/wiki.php/manSearch?google=none&name=pthread_cleanup_push">pthread_cleanup_push</a>(3)

1장. pthread_cleanup_push(3)

차례
1.1절. »ç¿ë¹ý
1.2절. ¼³¸í
1.3절. ¹Ýȯ°ª
1.4절. ¿¡·¯
1.5절. ¿¹Á¦

¾²·¹µå Á¾·á½Ã È£ÃâÇÒ ÇÔ¼ö¸¦ µî·ÏÇÑ´Ù.


1.1절. »ç¿ë¹ý

#include <pthread.h>

void pthread_cleanup_push(void (*routine) (void *), void *arg); 
		


1.2절. ¼³¸í

À̰ÍÀº ¾²·¹µåÁ¾·á Çڵ鷯(Cleanup handler)¸¦ µî·ÏÇϱâ À§Çؼ­ »ç¿ëÇÏ´Â ÇÔ¼öÀÌ´Ù. ÀÌ Çڵ鷯´Â ³ªÁß¿¡ ¾²·¹µå°¡ pthread_exit(3)°ú °°Àº ÇÔ¼ö¸¦ È£ÃâÇØ¼­ Á¾·áÇÒ¶§ ÀÚµ¿À¸·Î È£ÃâµÇ°Ô µÈ´Ù. º¸Åë Á¾·áµÇ´Â ¾²·¹µåÀÇ ÀÚ¿øÀ» ÇØÁ¦Çϱâ À§ÇÑ ¸ñÀûÀ¸·Î »ç¿ëµÈ´Ù. ¿¹¸¦µé¾î¼­ ¾²·¹µå°¡ mutex¸¦ Àá±Ý(lock) »óÅ·ΠÁ¾·áÇÏ°Ô µÈ´Ù¸é ÀÌ mutex´Â ¿µ¿øÈ÷ Àá±ä»óÅ·Π³²°Ô µÉ°ÍÀÌ´Ù. ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇØ°áÇÏ´Â °£´ÜÇÑ ¹æ¹ýÀº ¸ðµç ¾²·¹µå°¡ Á¾·áÇϱâ Àü¿¡ ÇÒ´çµÈ ÀÚ¿øÀÌ ÀÖ´ÂÁö È®ÀÎÇØ¼­ ÇØ´ç ¾²·¹µå°¡ Á÷Á¢ ÀÚ¿øÀ» ÇØÁ¦Çϵµ·Ï Äڵ带 ½á³Ö´Â ¹æ¹ýÀÏ °ÍÀÌ´Ù. ±×·¯³ª À̹æ¹ýÀÇ °æ¿ì ½Ç¼öÇÒ È®·üÀÌ ÀÖÀ¸¸ç, Áߺ¹µÇ´Â ¿©·¯°³ÀÇ Äڵ带 »ç¿ëÇÏ°Ô µÊÀ¸·Î À¯Áö,º¸¼ö¸¦ ¾î·Æ°Ô ¸¸µé¼ö ÀÖ´Ù. ÀÌ·²¶§ °øÅëÀ¸·Î »ç¿ëÇÒ¼ö ÀÖ´Â ¾²·¹µåÁ¾·á Çڵ鷯¸¦ µî·Ï½ÃÄѼ­ »ç¿ëÇϸé Á»´õ ÆíÇÏ°Ô °ü¸® °¡´ÉÇÒ°ÍÀÌ´Ù.

À̿ܿ¡µµ mallocµîÀ¸·Î ÇÒ´çµÈ ÀÚ¿øÀ» ÇØÁ¦Çϰųª ¿­¸° ÆÄÀÏÁöÁ¤ÀÚ¸¦ ´Ý±â À§ÇÑ ¸ñÀûÀ¸·Îµµ »ç¿ëÇÒ¼ö ÀÖ´Ù.

routineÀº Á¾·áÇڵ鷯·Î µî·ÏµÉ ÇÔ¼öÀ̸ç, ¾²·¹µå°¡ Á¾·áµÉ¶§ ÀÚµ¿À¸·Î È£ÃâµÈ´Ù. ÀÌ Á¾·áÇڵ鷯 ÇÔ¼ö´Â arg¸¦ ¾Æ±Ô¸ÕÆ®·Î ½ÇÇàµÈ´Ù.


1.5절. ¿¹Á¦

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>

// ¾²·¹µå ÇÔ¼ö
// 1Ãʸ¦ ±â´Ù¸°ÈÄ ¾Æ±Ô¸ÕÆ®^2 À» ¸®ÅÏÇÑ´Ù.
//

char *mydata;
void cleanup(void *);
void *t_function(void *data)
{
    int num = *((int *)data);
    int i = 0;
    int a = 1;
    // cleanup handler ·Î cleanup ÇÔ¼ö¸¦ 
    // ÁöÁ¤ÇÑ´Ù. 
    pthread_cleanup_push(cleanup, (void *)&a);
    mydata = (char *)malloc(1000);
    while(1)
    {
        if (i == 3)
        {
            // pthread_exit °¡ È£ÃâµÇ¸é¼­ 
            // cleanup À» È£ÃâÇÏ°Ô µÈ´Ù. 
            pthread_exit(0);
            return 1;
        }
        printf("loop %d\n", i);
        i++;
        sleep(1);
    }
    pthread_cleanup_pop(0);
}


int main()
{
    pthread_t p_thread;
    int thr_id;
    int status;
    int a = 100;


    thr_id = pthread_create(&p_thread, NULL, t_function, (void *)&a);
    if (thr_id < 0)
    {
        perror("thread create error : ");
        exit(0);
    }
    pthread_join(p_thread, (void **)&status);
    printf("Join finish\n");
}

// cleanup handler
void cleanup(void *myarg)
{
    printf("thread is clean up\n");
    printf("resource free\n");
    free(mydata);
}
		


EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.