Pthread : Thread ¿ì¼±¼øÀ§ ¹®Á¦
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
Docbook ¿ø¹®

¾²·¹µå ¿ì¼±¼øÀ§ ¹®Á¦ ÇØ°á

¾²·¹µå ¿ì¼±¼øÀ§ ¹®Á¦ ÇØ°á

À± »ó¹è

dreamyun@yahoo.co.kr

교정 과정
교정 0.82003³â 8¿ù 3ÀÏ 18½Ã
ÃÖÃÊ ¹®¼­ÀÛ¼º


1절. ¼Ò°³

ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´Ùº¸¸é "ºÐ¸í ÀÌ·¯ÇÑ »óȲ¿¡¼­´Â ÀÌ·¯ÇÑ ¹®Á¦°¡ ¹ß»ýÇÏÁö ¾Ê¾Æ¾ß Çϴµ¥", "ÄÚµå »óÀ¸·Ð ¾Æ¹«·± ¹®Á¦°¡ ¾ø´Âµ¥" ÇÁ·Î±×·¥ÀÇ ½ÇÇà¿¡ ¹®Á¦°¡ »ý±â´Â °æ¿ì°¡ ÀÖ´Ù.

pthread¸¦ ÀÌ¿ëÇØ¼­ ¾²·¹µå ÇÁ·Î±×·¡¹ÖÀ» ÇÒ¶§µµ ÀÌ·± ÀÏÀÌ °£È¤ ¹ß»ýÇÑ´Ù. ÀÌÁß "¾²·¹µå ¿ì¼±¼øÀ§"¿¡ µû¶ó¼­ ¹ß»ýÇÏ´Â ¹®Á¦Á¡¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸°Ú´Ù. ÀÌ ¹®Á¦´Â ÁÖÀÇÇØ¼­ ÇÁ·Î±×·¡¹Ö ÇÏÁö ¾ÊÀ» °æ¿ì °£È¤ ¹ß»ýÇϱ⵵ ÇÑ´Ù.

ÀÌ ±ÛÀº ¿©·¯ºÐÀÌ pthread¸¦ ÀÌ¿ëÇÑ ¾²·¹µå ÇÁ·Î±×·¡¹Ö¿¡ ´ëÇÑ ±âº»ÀûÀÎ ÀÌÇØ¸¦ °¡Áö°í ÀÖ´Ù´Â °¡Á¤ÇÏ¿¡ ¾º¿©Á® ÀÖ´Ù. ¿¹Á¦·Î Á¦½ÃµÈ ÄÚµåÀÇ Å×½ºÆ®´Â ¸®´ª½º(kernel-2.4.x)¿Í ¼Ö¶ó¸®½º 5.7ȯ°æ¿¡¼­ ÀÌ·ç¾î Á³´Ù.


2절. ¹®Á¦ ¹ß»ý

´ÙÀ½Àº À̹ø Å×½ºÆ®¿¡ »ç¿ëµÉ ¿¹Á¦ÄÚµå´Ù.

¿¹Á¦ : thread_test.c

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

void *threadfunc(void *arg);

main()
{
    int n, i, j;
    pthread_t threadid;

    if ((n = pthread_create(&threadid, NULL, threadfunc, NULL)) != 0 )
    {
        perror("Thread create error ");
        exit(0);
    }
    printf("Main Thread START\n");
    for (i = 0; i < 100000000; i++)
    {
        j = i*5;
    }
    printf("Main Thread END\n");
    pthread_join(threadid, NULL);
}

void *threadfunc(void *arg)
{
    int i, j;
    printf("Thread Start\n");

    for (i = 0; i < 100000000; i++)
    {
        j = i*5;
    }

    printf("Thread:end\n");
    return ;
}
		
ÄÚµå´Â ÃÖ¼ÒÇÑÀÇ Å×½ºÆ®°¡ °¡´ÉÇÑ ¼öÁØ¿¡¼­ ÀÛ¼ºµÇ¾ú´Ù. À§ÀÇ ÄÚµå´Â ¾ð¶æ º¸±â¿¡ ¾Æ¹« ¹®Á¦°¡ ¾øÀ» °Í °°°í, ½ÇÁ¦ ƯÁ¤ Ç÷§Æû¿¡¼­´Â ¹®Á¦ ¾øÀÌ ÀÛµ¿ÇÏÁö¸¸ Ç÷§ÆûÀ» À̵¿ÇßÀ» °æ¿ì »ó´çÈ÷ ½É°¢ÇÑ ¹®Á¦°¡ ¹ß»ýÇÑ´Ù.

À§ÀÇ Äڵ带 ¸®´ª½º¿¡¼­ ÄÄÆÄÀÏ ½ÃÄѼ­ ½ÇÇà ½ÃÄѺ¸¸é ¾Æ·¡¿Í °°Àº Ãâ·Â °á°ú ¹°À» º¸À̸鼭 Á¤»óÀûÀ¸·Î ÀÛµ¿ÇÏ´Â°É È®ÀÎ ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

[root@localhost test]# ./thread_test 
Main Thread START
Thread Start
Main Thread END
Thread:end
		
±×·¯³ª À§ÀÇ ¿¹Á¦¸¦ ¼Ö¶ó¸®½º¿¡¼­ ÄÄÆÄÀÏ ½ÃŰ¸é ´ÙÀ½°ú °°Àº °á°ú¹°À» º¸¿©ÁØ´Ù.
[root@sun5.7 /]$ ./thread_test 
Main Thread Start
Main Thread END
Thread Start
Thread:end
		
¸®´ª½º¿¡¼­ ó·³ 2°³ÀÇ ¾²·¹µå°¡ µ¿½Ã¿¡(Á¤È®È÷´Â µ¿½Ã°¡ ¾Æ´ÏÁö¸¸ ÀÌÇØÇϱ⠽±°Ô)¼öÇà µÇ´Â°Ô ¾Æ´Ï°í ¸ÞÀÎ ¾²·¹µå°¡ ³¡³¯ ¶§±îÁö ¾²·¹µå »ý¼ºÀÌ µÇÁö ¾ÊÀ½À» ¾Ë ¼ö ÀÖ´Ù. Äڵ忡 µû¶ó¼­´Â ƯÁ¤ ¾²·¹µå°¡ ¿µ¿øÈ÷ ½ÇÇàµÇÁö ¾Ê´Â ¹®Á¦°¡ ¹ß»ýÇÒ ¼öµµ ÀÖ´Ù. ¸®´ª½º¿¡¼­ °³¹ßµÇ´Â ¸¹Àº ÇÁ·Î±×·¥µéÀÌ ´Ù¸¥ À¯´Ð½º·Îµµ ¹èÆ÷ µÇ´Â °ÍÀ» °¨¾ÈÇÑ´Ù¸é ÀÌ´Â ¸Å¿ì ½É°¢ÇÑ ¹®Á¦ÀÌ´Ù.

¼Ö¶ó¸®½º¿¡¼­ ÀÌ·¯ÇÑ ¹®Á¦°¡ ¹ß»ýÇÏ´Â ÀÌÀ¯´Â ¾²·¹µå¶ó ÇÒÁö¶óµµ °³º°ÀûÀÎ ÇÁ·Î¼¼½º·Î ½ÇÇàµÇ´Â ¸®´ª½º¿Í ´Þ¸® ÇϳªÀÇ LWP¸¦ ³ª´²¼­ »ç¿ëÇϱ⠶§¹®¿¡ ÇϳªÀÇ ¾²·¹µå¿¡¼­ ¸Å¿ì ¹Ù»Ú°Ô ÀÛµ¿ÇÒ°æ¿ì ´ÙÀ½ ¾²·¹µå »ý¼ºÀ» À§ÇÑ ½ºÄÉÁ층¿¡ ¹®Á¦°¡ »ý±â±â ¶§¹®ÀÌ´Ù.

작은 정보: ¸®´ª½º¿¡¼­ÀÇ ¾²·¹µå´Â fork()¿Í À¯»çÇÑ clone()È£ÃâÀ» ÅëÇÑ °³º° ÇÁ·Î¼¼½º·Î »ý¼ºµÈ´Ù. ¾ÆÁ÷±îÁø(2.4.x) ¿ÏÀüÇÑ ¾²·¹µå¶ó°í º¼ ¼ö ¾øÀ¸¸ç ¿ÏÀüÇÑ ¾²·¹µåÀÇ Áö¿øÀº ¾Æ¸¶µµ Ä¿³Î 2.6.x¸¦ ±â´Ù·ÁºÁ¾ß ÇÒ°Í °°´Ù.


3절. ¹®Á¦ ÇØ°á

ºñ·Ï À§ÀÇ ¹®Á¦°¡ ¸®´ª½º¿¡¼­ ¹ß»ýÇÏÁø ¾ÊÁö¸¸ ¸¹Àº ¸®´ª½º¿¡¼­ °³¹ßµÇ´Â ÇÁ·Î±×·¥ÀÌ ¼Ö¶ó¸®½ºµîÀÇ ´Ù¸¥ À¯´Ð½º·Î Æ÷ÆÃµÇ°í ÀÖ´Ù´Â °ÍÀ» °¨¾ÈÇÑ´Ù¸é ¹Ýµå½Ã Àâ¾ÆÁà¾ß ÇÒ ¹®Á¦´Ù.

¹®Á¦ÀÇ ÇØ°á¹æ¹ýÀº ºñ±³Àû °£´ÜÇѵ¥, sleep(3)°è¿­ÀÇ ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ¾²·¹µå¿Í ¾²·¹µå »çÀÌ¿¡ ¾à°£ÀÇ ½Ã°£°£°ÝÀ» µÎ¾î¼­ ¾²·¹µå ½ºÄÉÁ층À» ÇÒ ¼ö ÀÖµµ·Ï ½Ã°£À» ¹ú¿©ÁÖ¸é µÈ´Ù. ´ÙÀ½Àº ¹®Á¦¸¦ ÇØ°áÇÑ ÄÚµåÀÌ´Ù.

  if ((n = pthread_create(&threadid, NULL, threadfunc, NULL)) != 0 )
  {
      perror("Thread create error ");
      exit(0);
  }
  usleep(100);
  printf("Main Thread START\n");
		


4절. °á·Ð

¾î¶»°Ô º¸¸é ÆÁ¼öÁØÀÇ ¸Å¿ì °£´ÜÇÑ ³»¿ëÀÎ°Í °°Áö¸¸ ÀÌ·± ¹®Á¦Àϼö·Ï ¹®Á¦ÀÇ ¿øÀÎÀÌ ¾Ö¸Å ¸ðÈ£ÇØ¼­ ÇØ°áÃ¥À» ã±â ¾î·Á¿î °æ¿ì°¡ ¸¹´Ù. ÀÌ·± °æ¿ìµµ ¸¶Âù°¡Áö´Ù. ¾Æ¸¶µµ pthread ¶óÀ̺귯¸®ÀÇ (±×¸® ½É°¢ÇÏÁö ¾ÊÀº?)¹®Á¦¶ó°í »ý°¢µÇ´Âµ¥ ¸·»ó ¹®Á¦°¡ ¹ß»ýÇßÀ» ¶§´Â Á¤¸» »ç¶÷À» Â¥Áõ³ª°Ô ÇÒ ¼ö ÀÖ´Â ¹®Á¦´Ù.

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