¸®´ª½º ½Ã½ºÅÛ ÇÁ·Î±×·¥¹Ö 7Àå ¾²·¹µå
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



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

Contents

1 Thread¿¡ ´ëÇØ¼­
1.1 Thread vs Process
1.2 Multi Thread ÇÁ·Î±×·¥ÀÇ ´ÜÁ¡
1.3 PThread
1.4 Multi Thread ÇÁ·Î±×·¥
1.5 Process, Kernel Thread, User Thread
1.6 ¾²·¹µåÀÇ »ý¼º°ú Á¾·á
1.6.1 pthread_create : ¾²·¹µå »ý¼º
1.6.2 pthread_join : ¾²·¹µå Á¤¸®
1.6.3 ¾²·¹µå »ý¼º ¿¹Á¦
1.6.4 Àڽľ²·¹µå¸¦ ºÎ¸ð¾²·¹µå·Î ºÎÅÍ ºÐ¸®Çϱâ
1.7 ¾²·¹µå µ¿±âÈ­
1.8 Á¢±ÙÁ¦¾î
1.8.1 mutex Àá±Ý
1.8.2 mutexÀÇ »ç¿ë
1.8.3 pthread_mutex_init
1.8.4 pthread_mutex_lock
1.8.5 pthread_mutex_unlock
1.8.6 mutex Àá±Ý ¿¹Á¦
1.9 ¾ÕÀ¸·Î ÇÒ °Í


<!> ¹®¼­´Â ¿Ï¼ºµÈ°Ô ¾Æ´Ï¸ç, Ʋ¸° ³»¿ëÀÌ ÀÖÀ» ¼ö ÀÖ½À´Ï´Ù. ¼öÁ¤ÇØ¾ß ÇÒ ºÎºÐÀÌ ÀÖÀ½ ¾Ë·ÁÁÖ¼¼¿ä. È®ÀÎ ÈÄ ¹Ý¿µÇϵµ·Ï ÇϰڽÀ´Ï´Ù.

1 Thread¿¡ ´ëÇØ¼­

ÇÁ·Î±×·¥À» º´·Ä·Î ½ÇÇà½ÃŰ´Â ¹æ¹ýÀ¸·Î fork()¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸¾Ò´Ù. fork()´Â ¸Å¿ì ÀÌÇØÇϱ⠽¬¿î ÇÁ·Î±×·¡¹Ö ¹æ¹ýÀ̱ä ÇÏÁö¸¸ ÀÚ¿øÈ¿À²¼º¿¡¼­ ¸î°¡Áö ¹®Á¦Á¡À» °¡Áö°í ÀÖ´Ù. ÇÁ·Î¼¼½º´Â ±âº»ÀûÀ¸·Î code, data, stack, file I/O, ±×¸®°í signal tableÀÇ 5°¡Áö ¿ä¼Ò·Î ±¸¼ºÀÌ µÈ´Ù. fork()¸¦ ÀÌ¿ëÇØ¼­ »õ·Î¿î ÇÁ·Î¼¼½º¸¦ »ý¼ºÇÏ°Ô µÇ¸é, ÀÌ·¯ÇÑ 5°¡Áö ±¸¼º¿ä¼Ò°¡ ¸ðµÎ º¹»ç°¡ µÈ´Ù. ±×·¯ÇÏ´Ù º¸´Ï ÇÁ·Î¼¼½º¸¦ »ý¼ºÇϴµ¥ ¸¹Àº ºñ¿ëÀÌ ¼ÒºñµÉ °ÍÀÌ´Ù. ´ë°ÔÀÇ °æ¿ì¿¡´Â ÇÁ·Î¼¼½º¸¦ »õ·Î »ý¼º½Ãų¶§ ¹ß»ýÇÏ´Â ¼º´ÉÀúÇϰ¡ ¹®Á¦°¡ µÇÁö´Â ¾Ê°ÚÁö¸¸ À¥¼­ºñ½ºÃ³·³ ´ë·®ÀÇ Á¢±ÙÀÌ ¹ß»ýÇÏ´Â ¿µ¿ª¿¡¼­´Â ¹®Á¦°¡ µÉ ¼ö ÀÖ´Ù.

forkÀÇ ÀÌ·¯ÇÑ ¹æ½ÄÀº »ó´çÈ÷ È¿À²ÀÌ ¶³¾îÁö´Â Ãø¸éÀÌ ÀÖ´Ù. ¾î¶² ÇÁ·Î±×·¥À» º´·Ä·Î ½ÇÇà½ÃŲ´Ù°í ÇßÀ» ¶§, ½ÇÁ¦ ¿ì¸®°¡ º´·Ä·Î ½ÇÇàµÇ±â¸¦ ¿øÇÏ´Â ¿µ¿ªÀº ÄÚµåÀÇ ÀϺκÐÀÌÁö ÇÁ·Î±×·¥ Àüü´Â ¾Æ´Ï±â ¶§¹®ÀÌ´Ù.
// ... 
pid = fork(); 
if (pid > 0) 
{ 
    // ½ÇÁ¦´Â ÀÌ ºÎºÐÀÇ Äڵ常 º´·Ä·Î ½ÇÇàµÇ¸é µÈ´Ù. 
    // fork()´Â ´Ù¸¥ ¸ðµç¿µ¿ªÀÇ Äڵ尡 º¹»çµÇ¾î ¹ö¸°´Ù. 
} 
 

°Ô´Ù°¡ ÀüÇô´Ù¸¥ ÇÁ·Î¼¼½º¸¦ »ý¼º½ÃÅ´À¸·Î½á, ÇÁ·Î¼¼½º°£ Åë½ÅÀ̶ó´Â »ó´çÈ÷ º¹ÀâÇÑ ¹®Á¦±îÁö¸¦ ÇØ°áÇØ¾ß ÇÑ´Ù. º´·Ä·Î ÀÛµ¿ÇÏ´Â ÇÁ·Î±×·¥Àº Ư¼º»ó µ¥ÀÌÅ͸¦ °øÀ¯Çϰųª ¼­·Î Åë½ÅÀ» ÇØ¾ß ÇÏ´Â °æ¿ì°¡ ¸¹´Ù. ±×·±µ¥ ÇÁ·Î¼¼½º´Â ¼­·Î µ¶¸³µÈ °´Ã¼À̹ǷΠÀϹÝÀûÀÎ ¹æ¹ýÀ¸·Î´Â µ¥ÀÌÅ͸¦ °øÀ¯ÇÒ ¼ö°¡ ¾ø´Ù. ÀÌ·¯ÇÑ ÇÁ·Î¼¼½º°£ µ¥ÀÌÅÍ Åë½ÅÀ» À§Çؼ­ ¸®´ª½º´Â IPC¶ó´Â ¼³ºñ¸¦ Á¦°øÇϴµ¥, IPC¶ó´Â°Ô »ç¿ëÇϱⰡ ¿©°£ ±î´Ù·ÓÁö°¡ ¾Ê´Ù. IPC¿¡ ´ëÇØ¼­´Â º°µµÀÇ ÀåÀ» ÇÒ¾ÖÇØ¼­ ´Ù·ê °èȹÀÌ´Ù.

Thread¸¦ ÀÌ¿ëÇϸé fork()¸¦ ÀÌ¿ëÇÑ ÇÁ·Î¼¼½º ±â¹ÝÀÇ º´·Äó¸®ÀÇ ¹®Á¦Á¡ÀÇ ¸¹Àº ºÎºÐÀ» ÇØ°áÇÒ ¼ö ÀÖ´Ù. Thread´Â »õ·Î¿î ÇÁ·Î¼¼½º¸¦ »ý¼º½ÃŰÁö ¾Ê°í, ƯÁ¤ ¹®¸Æ(ÄÚµå)¸¸À» º´·Ä·Î ½ÇÇàÇÒ ¼ö ÀÖµµ·Ï Çã¿ëÇÑ´Ù. »õ·Î¿î ÇÁ·Î¼¼½º¸¦ »ý¼º½ÃŰÁö ¾Ê±â ¶§¹®¿¡ ±×¸¸Å­ ÀÚ¿øÀ» ¾Æ³¥ ¼ö ÀÖÀ¸¸ç, ´õ È¿À²ÀûÀ¸·Î ºü¸£°Ô ¿òÁ÷ÀÏ ¼ö ÀÖ´Ù. ¶ÇÇÑ °°Àº ÇÁ·Î¼¼½ºÀ̱⠶§¹®¿¡, µ¥ÀÌÅ͸¦ °øÀ¯ÇϱⰡ ½±´Ù´Â ÀåÁ¡µµ °¡Áø´Ù.

1.1 Thread vs Process

Thread´Â ÇÁ·Î¼¼½º¿Í ´ÙÀ½°ú °°Àº Â÷ÀÌÁ¡À» °¡Áø´Ù.
  • ÇÁ·Î¼¼½º´Â µ¶¸³ÀûÀÌ´Ù. ¾²·¹µå´Â ÇÁ·Î¼¼½ºÀÇ ¼­ºê¼ÂÀÌ´Ù.
  • ÇÁ·Î¼¼½º´Â °¢°¢ µ¶¸³ÀûÀÎ ÀÚ¿øÀ» °¡Áø´Ù. ¾²·¹µå´Â stat, memory ±âŸ ´Ù¸¥ ÀÚ¿øµéÀ» °øÀ¯ÇÑ´Ù.
  • ÇÁ·Î¼¼½º´Â ÀڽŸ¸ÀÇ ÁÖ¼Ò¿µ¿ªÀ» °¡Áø´Ù. ¾²·¹µå´Â ÁÖ¼Ò¿µ¿ªÀ» °øÀ¯ÇÑ´Ù.
  • ÇÁ·Î¼¼½º´Â IPC¸¦ ÀÌ¿ëÇØ¼­¸¸ Åë½ÅÀÌ °¡´ÉÇÏ´Ù.
  • ÀϹÝÀûÀ¸·Î ¾²·¹µåÀÇ ¹®¸Æ±³È¯(context switching)´Â ÇÁ·Î¼¼½ºÀÇ ¹®¸Æ±³È¯º¸´Ù ºü¸£´Ù.

1.2 Multi Thread ÇÁ·Î±×·¥ÀÇ ´ÜÁ¡

¸ðµç µµ±¸°¡ ±×·¯ÇϵíÀÌ Multi Thread ÇÁ·Î±×·¥À̶ó°í ÇØ¼­ ÀåÁ¡¸¸ °¡Áø °ÍÀº ¾Æ´Ï´Ù. Multi Thread ÇÁ·Î±×·¥Àº Multi Process ÇÁ·Î±×·¡¹Ö ¹æ½Ä¿¡ ºñÇØ¼­ ´ÙÀ½°ú °°Àº ´ÜÁ¡À» °¡Áø´Ù.
  • ÇϳªÀÇ ¾²·¹µå¿¡¼­ ¹ß»ýµÈ ¹®Á¦°¡ Àüü ÇÁ·Î¼¼½º¿¡ ¿µÇâÀ» ¹ÌÄ£´Ù.
    ¸ÖƼ ÇÁ·Î¼¼½ºÀÇ °æ¿ì¿¡´Â ÇÁ·Î¼¼½ºÇϳª°¡ ¹®Á¦°¡ »ý±â´õ¶óµµ ´ÜÀÏ ÇÁ·Î¼¼½º·Î ¹®Á¦°¡ Á¦ÇѵȴÙ. ±×·¯³ª ¸ÖƼ¾²·¹µå ÇÁ·Î±×·¥ÀÇ °æ¿ì ÇϳªÀÇ ¾²·¹µå¿¡ »ý±ä ¹®Á¦°¡ ´Ù¸¥ ¾²·¹µå¿¡±îÁö ¿µÇâÀ» ÁÙ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î ¾²·¹µå Çϳª°¡ ´Ù¸¥ ÇÁ·Î¼¼½ºÀÇ ¸Þ¸ð¸® ¿µ¿ªÀ» ħ¹üÇÒ °æ¿ì ÇÁ·Î¼¼½º ÀÚü°¡ Á×¾î¹ö¸²À¸·Î½á, ÇÁ·Î¼¼½º¿¡ »ý¼ºµÈ ´Ù¸¥ ¸ðµç ¾²·¹µåµµ ÇÁ·Î¼¼½º¿Í ÇÔ²² Á×¾î¹ö¸®°Ô µÈ´Ù. - ÀÌ ¹®Á¦´Â ÇØ°á °¡´ÉÇÏÁö¸¸ ¿©±â¿¡¼­´Â ´Ù·çÁö ¾Êµµ·Ï ÇϰڴÙ. ½Ã±×³ÎÀ» Àß È°¿ëÇÏ¸é µÈ´Ù. °ü½ÉÀÖÀ¸¸é Çѹø °í¹ÎÇØ º¸±â ¹Ù¶õ´Ù. -
  • µð¹ö±ëÀÌ ¾î·Æ´Ù. ¹®¸ÆÀÌ ¼­·Î ±³È¯µÇ¹Ç·Î ÃßÀûÇϱⰡ ±î´Ù·Ó´Ù.

ÀÌ·¯ÇÑ ´ÜÁ¡ÀÌ ÀÖÀ½¿¡µµ ºÒ±¸ÇÏ°í ¸ÖÆ¼¾²·¹µù ÇÁ·Î±×·¡¹Ö ±â¹ýÀ» ¼±È£Çϰí ÀÖ´Ù.

1.3 PThread

Thread´Â ¿î¿µÃ¼Á¦¿¡¼­ Á¦°øÇÏ´Â º´·Äó¸® ¸ÞÄ¿´ÏÁòÀ¸·Î, ½ÇÁ¦ ÀÌ ¸ÞÄ¿´ÏÁòÀ» ÀÌ¿ëÇϱâ À§Çؼ­´Â ThreadÀÇ ±¸Çöü°¡ ÇÊ¿äÇÏ´Ù.

¸®´ª½º¿¡¼­´Â pthread¶ó´Â thread ±¸Çö ¶óÀ̺귯¸®°¡ »ç¿ëµÇ°í ÀÖ´Ù. pthread´Â POSIX thread ÀÇ ÁÙÀÓ¸»·Î POSIX Ç¥ÁØÀ» µû¸£°í ÀÖ´Ù. pthread´Â ¸®´ª½º »Ó¸¸ ¾Æ´Ï¶ó ´Ù¸¥ °ÅÀÇ ´ëºÎºÐÀÇ À¯´Ð½º¿¡¼­µµ »ç¿ëÇÒ ¼ö ÀÖ´Ù. À̿ܿ¡µµ BSD °è¿­¿¡¼­ »ç¿ëÇÏ´Â 'Light Weight Kernel Threads , Apple ¿¡¼­ »ç¿ëÇÏ´Â Multiprocessing ServicesµîÀÇ ±¸Çöü°¡ ÀÖ´Ù. ÀÌ ¹®¼­´Â pthread±¸Çö¸¸À» ¼³¸íÇϵµ·Ï ÇÒ °ÍÀÌ´Ù.

pthread´Â ¸®´ª½º ¿î¿µÃ¼Á¦¿¡¼­ Á¦°øÇÏ´Â thread ¸¦ Á¦¾îÇϱâ À§ÇÑ ÇÔ¼öµéÀ» ¸ð¾Æ ³õÀº C ¶óÀ̺귯¸®·Î, ´ÙÀ½°ú °°Àº ±â´ÉÀÇ ÇÔ¼ö±ºÀ» Á¦°øÇÑ´Ù.
  • ¾²·¹µå »ý¼º°ú Á¾·á °ü·Ã ÇÔ¼öµé
  • ¾²·¹µå µ¿±âÈ­ °ü·Ã ÇÔ¼öµé
    ¾²·¹µå´Â ¸¹Àº µ¥ÀÌÅ͸¦ °øÀ¯ÇÑ´Ù. ±×·¯¹Ç·Î µ¥ÀÌÅÍ¿¡ ´ëÇÑ µ¿±âÈ­ ¹®Á¦¸¦ ÇØ°áÇØ¾ßÇÒ Çʿ䰡 ÀÖ´Ù.
  • ¾²·¹µå ½Ã±×³Î Á¦¾î ÇÔ¼öµé
    signalÀº ÇÁ·Î¼¼½º´ÜÀ§·Î ÀÛµ¿ÇÑ´Ù. ±×·¯³ª ¾²·¹µå ÇÁ·Î±×·¥ÀÇ °æ¿ì, °¢ ¾²·¹µå ¸¶´Ù ´Ù¸¥ ½Ã±×³Î Á¤Ã¥ÀÌ ÇÊ¿äÇϹǷÎ, ¾²·¹µå Àü¿ëÀÇ ½Ã±×³Î Á¦¾î ÇÔ¼ö°¡ ÇÊ¿äÇÏ´Ù.

1.4 Multi Thread ÇÁ·Î±×·¥

º´·Ä·Î ÀÛµ¿ÇÏÁö ¾Ê´Â ÇϳªÀÇ ¹®¸ÆÈ帧¸¸À» °¡Áö´Â ÇÁ·Î±×·¥À» ´ÜÀÏ ¾²·¹µå ÇÁ·Î±×·¥À̶ó°í ÇÑ´Ù. ¹Ý´ë·Î ¾Æ·¡¿Í °°ÀÌ ¹®¸ÆÀÌ ³ª´µ¾î¼­, µ¿½Ã¿¡ µÎ°³ ÀÌ»óÀÇ ¾²·¹µå°¡ ½ÇÇàµÇ¸é, À̸¦ ¸ÖƼ ¾²·¹µå ÇÁ·Î±×·¥'''À̶ó°í ÇÑ´Ù.


1.5 Process, Kernel Thread, User Thread

ÇÁ·Î¼¼½º´Â °¡Àå ¹«°Å¿î Ä¿³ÎÀÇ ½ºÄÉÁ층 ´ÜÀ§ÀÌ´Ù. ÇÁ·Î¼¼½º´Â ¿î¿µÃ¼Á¦¿¡°Ô ÇÒ´ç¹ÞÀº ÀÚ¿øµé - ÆÄÀÏ Çڵ鷯,¼ÒÄÏ,ÀåÄ¡ Çڵ鷯 - À» ÇÒ´ç¹Þ°Ô µÈ´Ù. ÇÁ·Î¼¼½º´Â µ¶¸³µÈ ´ÜÀ§·Î½á ÆÄÀÏÀ̳ª ÁÖ¼Ò¿µ¿ª µîÀ» °øÀ¯ÇÏÁö ¾Ê´Â´Ù.

kernel thread´Â °¡Àå °¡º­¿î Ä¿³Î ½ºÄÉÁ층 ´ÜÀ§´Ù. ÇϳªÀÇ ÇÁ·Î¼¼½º´Â Àû¾îµµ ÇϳªÀÇ Ä¿³Î ¾²·¹µå¸¦ °¡Áö°Ô µÈ´Ù. ¸¸¾à¿¡ ÇÁ·Î¼¼½º°¡ ÇϳªÀÌ»óÀÇ ¾²·¹µå¸¦ °¡Áö°í ÀÖ´Ù¸é, ÀÌµé ¾²·¹µå´Â °°Àº ¸Þ¸ð¸®¿Í ÆÄÀÏÀÚ¿øµîÀ» °øÀ¯ÇÏ°Ô µÈ´Ù. ¸¸¾à Ä¿³ÎÀÇ ÇÁ·Î¼¼½º ½ºÄÉÁì·¯°¡ ¼±Á¡ÇüÀ̶ó¸é ¾²·¹µåÀÇ ½ºÄÉÁì·¯µµ ¼±Á¡ÇüÀÎ °æ¿ì°¡ ¸¹´Ù. Âü°í»ï¾Æ¼­ ¼±Á¡Çü°ú ºñ¼±Á¡Çü¿¡ ´ëÇØ¼­ °£·«ÇÏ°Ô ¼³¸íÇϵµ·Ï ÇϰڴÙ.
  • ºñ¼±Á¡Çü : ƯÁ¤ ÇÁ·Î¼¼½º°¡ CPU¸¦ µ¶Á¡ÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù.
  • ¼±Á¡Çü : ƯÁ¤ ÇÁ·Î¼¼½º°¡ CPU¸¦ µ¶Á¡ÇÏ´Â°Ô ºÒ°¡´ÉÇÏ´Ù.
ƯÁ¤ ÇÁ·Î¼¼½º°¡ CPU¸¦ µ¶Á¡ÇÏ´Â°Ô ºÒ°¡´ÉÇÏ°Ô ÇÏ´Â °ÍÀº ÇÁ·Î¼¼½º°¡ ÀÎÅÍ·´Æ®¸¦ ¹«½ÃÇϱ⠸øÇÏ°Ô ÇÏ´Â °ÍÀ¸·Î ±¸ÇöÇÑ´Ù. ¼±Á¡ÇüÀº ¾î¶² ÇÁ·Î¼¼½º°¡ ½Ã½ºÅÛÄÝÀ» ¼öÇàÁßÀÌ´õ¶óµµ Ä¿³ÎÀÌ ÀÎÅÍ·´Æ®¸¦ º¸³»¸é, Áï½Ã ºüÁ® ³ª¿Í¾ß ÇÑ´Ù. Áï ¿î¿µÃ¼Á¦°¡ CPU¸¦ ¼±Á¡ÇÑ´Ù´Â ¾ê±â°¡ µÈ´Ù. ½Ã½ºÅÛÄÝÀÌ ¼öÇàÁßÀÌ´õ¶óµµ ÀÎÅÍ·´Æ®¸¦ °É°í ´Ù¸¥ ÀÏÀ» ¼öÇàÇϵµ·Ï ÇÒ ¼ö ÀÖÀ¸¹Ç·Î º¸´Ù ºü¸¥ ¹ÝÀÀ¼ºÀ» º¸¿©ÁØ´Ù.

¶§¶§·Î ¾²·¹µå°¡ À¯Àú¿µ¿ª ¶óÀ̺귯¸®·Î ±¸ÇöµÇ´Â °æ¿ì°¡ Àִµ¥, À̸¦ user Thread ¶ó°í ºÎ¸¥´Ù.

1.6 ¾²·¹µåÀÇ »ý¼º°ú Á¾·á

¸ÖƼ ¾²·¹µå ÇÁ·Î±×·¥À̶ó°í ÇÏ´õ¶óµµ, óÀ½ ½ÃÀ۵ǾúÀ» ¶§´Â main()¿¡¼­ ½ÃÀ۵Ǵ ´ÜÀÏ ¾²·¹µå »óÅ·ΠÀÛµ¿ÀÌ µÈ´Ù. ÀÌ »óÅ¿¡¼­ pthread_create(3) ÇÔ¼ö¸¦ È£ÃâÇÔÀ¸·Î½á, »õ·Î¿î ¾²·¹µå¸¦ »ý¼ºÇÒ ¼ö ÀÖ´Ù. pthread_create¸¦ ÀÌ¿ëÇØ¼­ »ý¼ºµÈ »õ·Î¿î ¾²·¹µå¸¦ worker ¾²·¹µå¶ó°í ÇÏÀÚ.

¸ÖƼ ¾²·¹µå ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°Àº È帧À» °¡Áø´Ù.


»ý¼ºµÈ worker thread´Â ¾ðÁ¨°¡ Á¾·á°¡ µÉ °ÍÀÌ´Ù. Master Thread (ÀÌÇÏ ºÎ¸ð ¾²·¹µå)´Â pthread_join()À» ÀÌ¿ëÇØ¼­ worker threadµéÀÇ Á¾·á¸¦ ±â´Ù¸°´Ù. pthread_join()´Â Á¾·áµÈ worker threadÀÇ ÀÚ¿øÀ» Á¤¸®ÇÏ´Â ÀÏÀ» ÇÑ´Ù. fork()¸¦ ÀÌ¿ëÇÑ ¸ÖƼ ÇÁ·Î¼¼½º ÇÁ·Î±×·¥¿¡¼­, ºÎ¸ð ÇÁ·Î¼¼½º°¡ wait()¸¦ ÀÌ¿ëÇØ¼­ ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ ±â´Ù¸®´Â °Í°ú °°Àº ÀÌÀ¯¶ó°í º¸¸é µÈ´Ù.

1.6.1 pthread_create : ¾²·¹µå »ý¼º

pthread_create(3)ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¸é »õ·Î¿î ¾²·¹µå¸¦ »ý¼ºÇÒ ¼ö ÀÖ´Ù. ÀÌ ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
#include <pthread.h> 
 
int  pthread_create(pthread_t  *  thread, pthread_attr_t *attr,  
     void * (*start_routine)(void *), void * arg); 
 
  1. thread : ¾²·¹µå°¡ ¼º°øÀûÀ¸·Î »ý¼ºµÇ¾úÀ» ¶§, ³Ñ°ÜÁÖ´Â ¾²·¹µå ½Äº° ¹øÈ£.
  2. attr : ¾²·¹µåÀÇ Æ¯¼ºÀ» ¼³Á¤Çϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. NULLÀÏ °æ¿ì ±âº» Ư¼º
  3. start_routine : ¾²·¹µå°¡ ¼öÇàÇÒ ÇÔ¼ö·Î ÇÔ¼öÆ÷ÀÎÅ͸¦ ³Ñ°ÜÁØ´Ù.
  4. arg : ¾²·¹µå ÇÔ¼ö start_routine¸¦ ½ÇÇà½Ãų ¶§, ³Ñ°ÜÁÙ ÀÎÀÚ
ÀÌ ÇÔ¼ö´Â ¼º°øÀûÀ¸·Î ¼öÇàµÇ¾ú´Ù¸é, 0À» ¸®ÅÏÇÑ´Ù. ±×·¸Áö ¾ÊÀ» °æ¿ì 1À» ¸®ÅÏÇÑ´Ù.

1.6.2 pthread_join : ¾²·¹µå Á¤¸®

¾²·¹µå°¡ ½ÇÇà½ÃŰ´Â °ÍÀº ÇÔ¼ö ÀÌ´Ù. ±×·¯¹Ç·Î returnÀ̳ª exit(0)µîÀ» ÀÌ¿ëÇØ¼­ ¾²·¹µå¸¦ Á¾·á½Ãų ¼ö ÀÖ°Ô µÈ´Ù. ±×·¯³ª ¾²·¹µå ÇÔ¼ö°¡ Á¾·áµÇ¾ú´Ù°í ÇØ¼­ °ð¹Ù·Î ¾²·¹µåÀÇ ¸ðµçÀÚ¿øÀÌ Á¾·áµÇÁö ¾Ê´Â´Ù. fork()±â¹ÝÀÇ ¸ÖƼÇÁ·Î¼¼½º ÇÁ·Î±×·¥¿¡¼­ Á¾·áµÈ ÀÚ½ÄÇÁ·Î¼¼½º¸¦ Á¤¸®Çϱâ À§Çؼ­ wait()·Î ±â´Ù¸®µíÀÌ, Á¾·áµÈ ¾²·¹µå¸¦ ±â´Ù·Á¼­ Á¤¸®¸¦ ÇØÁÖ¾î¾Æ¸¸ ÇÑ´Ù. ±×·¸Áö ¾ÊÀ» °æ¿ì ¾²·¹µåÀÇ ÀÚ¿øÀÌ µÇµ¹·ÁÁöÁö ¾Ê¾Æ¼­ ¸Þ¸ð¸® ´©¼öÇö»óÀÌ ¹ß»ýÇÏ°Ô µÈ´Ù.

pthread_create()·Î »ý¼º½ÃŲ ¾²·¹µå´Â pthread_join()À» ÅëÇØ¼­ ±â´Ù¸®¸é µÈ´Ù. pthread_join ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
#include <pthread.h> 
 
int pthread_join(pthread_t th, void **thread_return); 
 
  1. th : pthread_create¿¡ ÀÇÇØ¼­ »ý¼ºµÈ, ½Äº°¹øÈ£ th¸¦ °¡Áø ¾²·¹µå¸¦ ±â´Ù¸®°Ú´Ù´Â ¾ê±â´Ù.
  2. thread_return : ½Äº°¹øÈ£ thÀÎ ¾²·¹µåÀÇ Á¾·á½Ã ¸®ÅϰªÀÌ´Ù.

pthread_joinÀÌ ÇÏ´Â ÀÏÀº ¸íÈ®ÇÏ´Ù. ´Ù¸¸ ÁÖÀÇ ÇÒ°ÍÀº pthread_joinÀº ¹Ýµå½Ã joinable ÇÑ »óÅ·Π»ý¼ºµÈ ¾²·¹µå¸¸À» ±â´Ù¸± ¼ö ÀÖ´Ù´Â Á¡ÀÌ´Ù. pthread_create·Î ¾²·¹µå¸¦ »ý¼º½Ãų ¶§, ³ªÁß¿¡ joinµÇÁö ¾ÊÀ» °ÍÀ¸·Î »ý°¢ÇÏ°í »ý¼º½Ãų ¼ö Àִµ¥, ÀÌ·¸°Ô µÇ¸é ÀÌ ¾²·¹µå´Â Á¾·áÇÏÀÚ¸¶ÀÚ ¸ðµç ÀÚ¿øÀ» ÇØÁ¦Çϸç, pthread_joinÀ¸·Î ±â´Ù¸± ¼ö°¡ ¾ø´Ù. ºÎ¸ð¾²·¹µå¿Í ¶³¾îÁ®¼­ ¿ÏÀüÈ÷ µ¶¸³ÀûÀ¸·Î ÀÛ¿ëÇÑ´Ù°í ÇÏ¿©, À̸¦ detach ÇÑ´Ù°í ÇÑ´Ù. ¾²·¹µå¸¦ detachÇÏ´Â ¹æ¹ýÀº ¾Æ·¡¿¡¼­ ´Ù·ê °ÍÀÌ´Ù.

1.6.3 ¾²·¹µå »ý¼º ¿¹Á¦

pthread_create¿Í pthread_joinÀ» ¾Ë°í ÀÖ´Ù¸é, ÀÌÁ¦ thread¸¦ »ý¼º½Ãų ¼ö ÀÖ´Ù.
#include <pthread.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
 
// ¾²·¹µå ÇÔ¼ö 
void *t_function(void *data) 
{ 
    int id; 
    int i = 0; 
    id = *((int *)data); 
 
    while(1) 
    { 
        printf("%d : %d\n", id, i); 
        i++; 
        sleep(1); 
    } 
} 
 
int main() 
{ 
    pthread_t p_thread[2]; 
    int thr_id; 
    int status; 
    int a = 1; 
    int b = 2; 
 
    // ¾²·¹µå »ý¼º ¾Æ±Ô¸ÕÆ®·Î 1 À» ³Ñ±ä´Ù.   
    thr_id = pthread_create(&p_thread[0], NULL, t_function, (void *)&a); 
    if (thr_id < 0) 
    { 
        perror("thread create error : "); 
        exit(0); 
    } 
 
    // ¾²·¹µå »ý¼º ¾Æ±Ô¸ÕÆ®·Î 2 ¸¦ ³Ñ±ä´Ù.  
    thr_id = pthread_create(&p_thread[1], NULL, t_function, (void *)&b); 
    if (thr_id < 0) 
    { 
        perror("thread create error : "); 
        exit(0); 
    } 
 
    // ¾²·¹µå Á¾·á¸¦ ±â´Ù¸°´Ù.  
    pthread_join(p_thread[0], (void **)&status); 
    pthread_join(p_thread[1], (void **)&status); 
 
    return 0; 
} 
 
¾ÆÁÖ ÀüÇüÀûÀÎ ÇÁ·Î±×·¥À̱ä ÇÏÁö¸¸ pthread_joinºÎºÐ¿¡ ¹®Á¦°¡ ÀÖ´Ù. pthread_joinÀº ¾²·¹µå°¡ Á¾·áµÉ ¶§±îÁö ºí·°µÇ±â ¶§¹®ÀÌ´Ù. ÀÌ·¡¼­´Â ¾²·¹µå¸¦ µÎ°³ÀÌ»ó »ý¼º½ÃŰÁö ¸øÇÒ °ÍÀÌ´Ù. ±×·¸´Ù°í pthread_joinÀ» ÀÌ¿ëÇÏÁö ¾Ê´Â´Ù¸é, ¸Þ¸ð¸® ´©¼ö°¡ »ý±â°Ô µÇ´Ï, »ý·«ÇÒ ¼öµµ ¾ø´Â ³ë¸©ÀÌ´Ù.

1.6.4 Àڽľ²·¹µå¸¦ ºÎ¸ð¾²·¹µå·Î ºÎÅÍ ºÐ¸®Çϱâ

pthread_joinÀÇ »ç¿ëÀ¸·Î ¹ß»ýÇÒ ¼ö ÀÖ´Â ¹®Á¦Á¡À» ÇØ°áÇϱâ À§ÇÑ, °¡Àå ÁÁÀº ¹æ¹ýÁßÀÇ Çϳª´Â pthread_detach ¸¦ ÀÌ¿ëÇØ¼­, ÀÚ½Ä ¾²·¹µå¸¦ ºÎ¸ð¾²·¹µå¿Í ¿ÏÀüÈ÷ ºÐ¸®ÇØ ¹ö¸®´Â ¹æ¹ýÀÌ´Ù. ÀÌ °æ¿ì ÀÚ½Ä ¾²·¹µå°¡ Á¾·áµÇ¸é, ¸ðµç ÀÚ¿øÀÌ Áï½Ã ¹ÝȯµÈ´Ù. ¹Ý¸é, ÀÚ½Ä ¾²·¹µåÀÇ Á¾·á»óŸ¦ ¾Ë ¼ö ¾ø´Ù´Â ¹®Á¦°¡ ¹ß»ýÇÑ´Ù. ´ë°ÔÀÇ °æ¿ì ÀÚ½Ä ¾²·¹µåÀÇ Á¾·á»óŰ¡ Áß¿äÇÑ ¹®Á¦°¡ µÇÁö´Â ¾ÊÀ» °ÍÀÌ´Ù.

¸¸¾à ÀÚ½Ä ¾²·¹µåÀÇ Á¾·á»óŸ¦ ¾Ë¾Æ³»´Â°Ô Áß¿äÇÏ´Ù¸é, Á¾·á»óŸ¦ ÀúÀåÇÒ Àü¿ªº¯¼ö¸¦ µÎ°í, ¿©±â¿¡ Á¾·á»óŸ¦ ±â·ÏÇÏ´Â ¹æ½ÄÀ» »ç¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀÚ½Ä ¾²·¹µå°¡ Á¾·áÇÒ¶§, º¯¼öÀÇ °ªÀ» ¹Ù²Ù°í, ºÎ¸ð¾²·¹µå¿¡ ½Ã±×³ÎÀ» Àü¼ÛÇÏ´Â ¹æ¹ýÀÌ´Ù. ÀÌ ¹æ¹ýÀº ÀÌ ¹®¼­ÀÇ µÚ¿¡¼­ µû·Î ´Ù·çµµ·Ï ÇϰڴÙ.
#include <pthread.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
 
// ¾²·¹µå ÇÔ¼ö 
// 1Ãʸ¦ ±â´Ù¸°ÈÄ ¾Æ±Ô¸ÕÆ®^2 À» ¸®ÅÏÇÑ´Ù. 
void *t_function(void *data) 
{ 
    char a[100000]; 
    int num = *((int *)data); 
    printf("Thread Start\n"); 
    sleep(5); 
    printf("Thread end\n"); 
} 
 
int main() 
{ 
    pthread_t p_thread; 
    int thr_id; 
    int status; 
    int a = 100; 
 
    printf("Before Thread\n");  
    thr_id = pthread_create(&p_thread, NULL, t_function, (void *)&a); 
    if (thr_id < 0) 
    { 
        perror("thread create error : "); 
        exit(0); 
    } 
 
    // ½Äº°¹øÈ£ p_thread ¸¦ °¡Áö´Â ¾²·¹µå¸¦ detach  
    // ½ÃÄÑÁØ´Ù. 
    pthread_detach(p_thread); 
    pause(); 
    return 0; 
} 
 

1.7 ¾²·¹µå µ¿±âÈ­

ÀÌÁ¦ ¿ì¸®´Â °£´ÜÇÑ ´ÙÁß¾²·¹µå ÇÁ·Î±×·¥À» ¸¸µé ¼ö ÀÖ°Ô µÇ¾ú´Ù. ±×·¯³ª ÀÌµé ¾²·¹µå »ý¼º ÇÔ¼ö¸¸ °¡Áö°í´Â º¹ÀâÇÑ ¾²·¹µå ÇÁ·Î±×·¥À» ¸¸µé ¼ö°¡ ¾ø´Ù. ¾²·¹µå°£ µ¿±âÈ­¶ó°í ÇÏ´Â ¹®Á¦°¡ ³õ¿©Àֱ⠶§¹®ÀÌ´Ù. ¾ÆÁÖ °£´ÜÇÑ ÇÁ·Î±×·¥ÀÌ ¾Æ´ÑÇÑÀº ¹Ýµå½Ã µ¿±âÈ­¹®Á¦¸¦ °í¹ÎÇØ¾ß¸¸ÇÑ´Ù.

µ¿±âÈ­¶õ ¿©·¯°¡Áö Àǹ̷Π»ç¿ëµÉ ¼ö Àִµ¥, ÀÌ °æ¿ì¿¡ À־ µ¿±âÈ­´Â ¼­·ÎÀÇ ½Ã°£À» ¸ÂÃá´Ù¸¦ ÀǹÌÇÑ´Ù. ¸ÖƼ¾²·¹µå ÇÁ·Î±×·¥Àº ÇϳªÀÇ ½Ã°£¿¡ ¿©·¯°³ÀÇ ÇÁ·Î¼¼½º°¡ µ¹¾Æ°¡´Â ÇüŸ¦ ÃëÇÑ´Ù. ¶ÇÇÑ ¸ÖƼ¾²·¹µå ÇÁ·Î±×·¥Àº ÀÚ¿øÀÇ »ó´çºÎºÐÀ» ¼­·Î °øÀ¯ÇÏ´Â °æ¿ì°¡ ¸¹´Ù. ¸¸¾à ´ÜÁö ÀÚ¿øÀ» ÀоîµéÀÌ´Â °Å¶ó¸é »ó°ü¾øÁö¸¸ Àаí/¾²´Â °ÍÀ̶ó¸é µ¿±âÈ­¿Í °ü·ÃµÈ ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù.

¿¹ÄÁµ¥ ´ÙÀ½°ú °°Àº °æ¿ì´Ù.
  1. A¿Í B µÎ°³ÀÇ ÇÁ·Î¼¼½º°¡ ÀÖ´Ù. ÀÌ ÇÁ·Î¼¼½º´Â int count=1 À̶ó´Â ÀÚ¿øÀ» °øÀ¯ÇÑ´Ù.
  2. A°¡ count¸¦ ÀоîµéÀ̰í 1À» ´õÇÑ´Ù.
  3. B°¡ count¸¦ ÀоîµéÀδÙ. ¾ÆÁ÷ A°¡ count¿¡ ¾²Áö ¾Ê¾Ò±â ¶§¹®¿¡, Bµµ 1À» ÀоîµéÀδÙ.
  4. A°¡ count¿¡ 2¸¦ ¾´´Ù.
  5. Bµµ count¿¡ 2¸¦ ¾´´Ù.
  6. count¿¡´Â 2°¡ ÀúÀåµÇ¾ú´Ù.
¿ì¸®°¡ ¿øÇÏ´Â °ªÀº 2°¡ ¾Æ´Ñ 3ÀÌ´Ù. ±×·¯³ª ¾²·¹µå°¡ µ¿±âÈ­ µÇÁö ¾ÊÀ½À¸·Î½á, ¿øÄ¡¾ÊÀº À߸øµÈ ¿¬»êÀ» ÇÏ°Ô µÇ¾ú´Ù. ¿ì¸®´Â ÀÌ ¹®Á¦¸¦ ÇØ°áÇØ¾ß ÇÑ´Ù.

1.8 Á¢±ÙÁ¦¾î

µ¿±âÈ­ ¹®Á¦´Â Çö½Ç¼¼°è¿¡¼­µµ ÀÚÁÖ ¹ß»ýÇÑ´Ù. È­Àå½ÇÀ» »ý°¢ÇÏ¸é µÈ´Ù. È­Àå½ÇÀº °øÀ¯ÀÚ¿øÀ̸ç, ¿©·¯¸íÀÌ »ç¿ëÇÑ´Ù. ´©±º°¡ È­Àå½ÇÀ» »ç¿ëÇϰí ÀÖ´Ù¸é, ´Ù¸¥ »ç¶÷Àº È­Àå½ÇÀ» »ç¿ëÇÏ¸é ¾ÈµÈ´Ù. ÀÌ ¹®Á¦¸¦ ¿ì¸®´Â Á¢±ÙÀ» Á¦¾îÇÏ´Â ¹æ½ÄÀ¸·Î ÇØ°áÇÑ´Ù. ¹®À» °É¾î Àá±Å¼­ Çѹø¿¡ ÇÑ»ç¶÷¸¸ È­Àå½Ç¿¡ µé¾î°¡µµ·Ï ÇÏ´Â ¹æ¹ýÀÌ´Ù. ¸Å¿ì ÀÌÇØÇϱ⠽¬¿î ¹æ½ÄÀÌ´Ù.

´ÙÁß¾²·¹µå ÇÁ·Î±×·¥¿¡¼­µµ ¸¶Âù°¡Áö·Î Á¢±ÙÁ¦¾î¸¦ ÀÌ¿ëÇØ¼­ ÀÌ ¹®Á¦¸¦ ÇØ°áÇÑ´Ù. À̸¦ À§Çؼ­ pthread´Â mutex¶ó´Â Àá±Ý ¸ÞÄ¿´ÏÁòÀ» Á¦°øÇÑ´Ù.

1.8.1 mutex Àá±Ý

µ¿½Ã¿¡ ¿©·¯°³ÀÇ ¾²·¹µå°¡ ÇϳªÀÇ ÀÚ¿ø¿¡ Á¢±ÙÇÏ·Á°í ÇÒ¶§ ¹ß»ýÇÏ´Â ¹®Á¦¸¦ pthread´Â ÀӰ迵¿ªÀ» µÎ´Â °ÍÀ¸·Î ÇØ°áÇϰí ÀÖ´Ù. ÀӰ迵¿ª¾È¿¡´Â Á¢±ÙÇϰíÀÚ ÇÏ´Â ÀÚ¿øÀÌ ³õ¿©ÀÖ°í, ¿ÀÁ÷ ÇϳªÀÇ ¾²·¹µå¸¸ ÀӰ迵¿ª¾ÈÀ¸·Î ÁøÀÔÇÒ ¼ö ÀÖµµ·Ï Á¦ÇÑÇÑ´Ù. pthread´Â À̸¦ À§Çؼ­ mutex¸¦ Á¦°øÇÑ´Ù. mutex´Â ±× ÀÚü°¡ °¡Áö´Â Àá±ÝÀÇ Æ¯¼º ¶§¹®¿¡ mutex Àá±ÝÀ̶ó°í ºÒ¸®¿öÁö±âµµ ÇÑ´Ù.


À§ ±×¸²Àº mutex°¡ ÀÛµ¿ÇÏ´Â ¹æ½ÄÀ» º¸¿©ÁØ´Ù. thread 1ÀÌ ÀÚ¿ø¿¡ Á¢±ÙÇϸé mutex Àá±ÝÀ» ¾ò°Ô µÈ´Ù. ÀÌ Àá±ÝÀº ´ÜÁö Çϳª¸¸ Á¸ÀçÇϱ⠶§¹®¿¡ thread 2´Â Àá±ÝÀ» ¾òÁö ¸øÇϰí ÀӰ迵¿ª ¹Û¿¡¼­ ´ë±âÇÏ°Ô µÈ´Ù. thread 1ÀÌ ÀÚ¿øÀ» ¸ðµÎ »ç¿ëÇϰí ÀӰ迵¿ªÀ» ¹þ¾î³ª¸é thread 2´Â Àá±ÝÀ» ¾ò°Ô µÇ°í ÀӰ迵¿ª¿¡ ÁøÀÔÇØ¼­ ÀÚ¿øÀ» »ç¿ëÇÒ ¼ö ÀÖ°Ô µÈ´Ù.

1.8.2 mutexÀÇ »ç¿ë

mutex¸¦ »ç¿ëÇϱâ À§Çؼ­´Â ´ÙÀ½ÀÇ 4°¡Áö ÇÔ¼ö°¡ ÇÊ¿äÇÏ´Ù.
  • mutex Àá±Ý°´Ã¼À» ¸¸µå´Â ÇÔ¼ö
  • mutex Àá±ÝÀ» ¾ò´Â ÇÔ¼ö
  • mutex Àá±ÝÀ» µÇµ¹·ÁÁÖ´Â ÇÔ¼ö
  • mutex Àá±Ý°´Ã¼¸¦ Á¦°ÅÇÏ´Â ÇÔ¼ö

1.8.3 pthread_mutex_init

mutex¸¦ »ç¿ëÇϱâ À§Çؼ­´Â ¸ÕÀú pthread_mutex_init() ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­, mutex Àá±Ý °´Ã¼¸¦ ¸¸µé¾îÁà¾ß ÇÑ´Ù.
pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutex_attr *attr); 
 
ÀÌ ÇÔ¼ö´Â µÎ°³ÀÇ ÀÎÀÚ¸¦ ÇÊ¿ä·Î ÇÑ´Ù.
  1. mutex : mutex Àá±Ý°´Ã¼
  2. mutex_attr : mutex´Â fast, 'recursive, error checkingÀÇ 3Á¾·ù°¡ ÀÖ´Ù. ÀÌ °ªÀ» ÀÌ¿ëÇØ¼­ mutex ŸÀÔÀ» °áÁ¤ÇÒ ¼ö ÀÖ´Ù. NULL Àϰæ¿ì ±âº»°ªÀÌ fast°¡ ¼³Á¤µÈ´Ù.
    • fast : ÇϳªÀÇ ¾²·¹µå°¡ ÇϳªÀÇ Àá±Ý¸¸À» ¾òÀ» ¼ö ÀÖ´Â ÀϹÝÀûÀÎ ÇüÅÂ
    • recursive : Àá±ÝÀ» ¾òÀº ¾²·¹µå°¡ ´Ù½Ã Àá±ÝÀ» ¾òÀ» ¼ö ÀÖ´Ù. ÀÌ °æ¿ì Àá±Ý¿¡ ´ëÇÑ Ä«¿îµå°¡ Áõ°¡ÇÏ°Ô µÈ´Ù.
mutex_attrÀ» À§Çؼ­ ´ÙÀ½ÀÇ »ó¼ö°ªÀÌ ¿¹¾àµÇ¾î ÀÖ´Ù.
  • fast : PTHREAD_MUTEX_INITIALIZER
  • recursive : PTHREAD_RECURSIVE_MUTEX_INITIALIZER
  • error checking : PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP

1.8.4 pthread_mutex_lock

mutex Àá±ÝÀ» ¾ò±â À§ÇÑ ÇÔ¼ö´Ù.
int pthread_mutex_lock(pthread_mutex_t *mutex); 
 
mutex Àá±ÝÀ» ¾ò´Â´Ù¶ó´Â Ç¥Çöº¸´Ù´Â mutex Àá±ÝÀ» ¿äûÇÑ´Ù¶ó´Â Ç¥ÇöÀÌ ´õ Á¤È®ÇÒ °Í °°´Ù. ¸¸¾à mutex Àá±ÝÀ» ¼±Á¡ÇÑ ¾²·¹µå°¡ ÀÖ´Ù¸é, ¼±Á¡ÇÑ ¾²·¹µå°¡ mutex Àá±ÝÀ» µÇµ¹·ÁÁÖ±â Àü±îÁö ÀÌ Äڵ忡¼­ ´ë±âÇÏ°Ô µÈ´Ù.

¶§¶§·Î Àá±ÝÀ» ¾òÀ» ¼ö ÀÖ´ÂÁö¸¸ üũÇÏ°í ´ë±â(ºí·°)µÇÁö ¾ÊÀº »óÅ·Π´ÙÀ½ ÄÚµå·Î ³Ñ¾î°¡¾ßÇÒ Çʿ䰡 ÀÖÀ» ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀÌ °æ¿ì¿¡´Â ¾Æ·¡ÀÇ ÇÔ¼ö¸¦ »ç¿ëÇÏ¸é µÈ´Ù.
int pthread_mutex_trylock(pthread_mutex_t *mutex); 
 

1.8.5 pthread_mutex_unlock

mutex Àá±ÝÀ» µÇµ¹·ÁÁÖ´Â ÇÔ¼ö´Ù.
int pthread_mutex_unlock(pthread_mutex_t *mutex); 
 

1.8.6 mutex Àá±Ý ¿¹Á¦

count ÇÁ·Î±×·¥À» ¿¹Á¦·Î ÇÒ °ÍÀÌ´Ù. ÀӰ迵¿ª¾È¿¡¼­ º¸È£µÇ¾î¾ßÇÒ ÀÚ¿øÀº countÀ̰í, ¿©·¯°³ÀÇ ¾²·¹µå°¡ count¿¡ Á¢±ÙÇØ¼­ +1À» ½ÃµµÇÏ·Á°í ÇÑ´Ù. À̶§ Á¦´ë·ÎµÈ count¸¦ À§Çؼ­´Â Çѹø¿¡ ÇϳªÀÇ ¾²·¹µå¸¸ÀÌ countingÀ» Çϵµ·Ï ÇØ¾ßÇÒ °ÍÀÌ´Ù. mutex¸¦ ÀÌ¿ëÇØ¼­ ÀӰ迵¿ªÀ» º¸È£Çϵµ·Ï ÇÒ °ÍÀÌ´Ù.

ÀӰ迵¿ªÀ» º¸È£ÇÏÁö ¾ÊÀ» °æ¿ì ´ÙÀ½°ú °°Àº ¹®Á¦°¡ ¹ß»ýÇÒ ¼öµµ ÀÖÀ» °ÍÀ» ¿¹»óÇÒ ¼ö ÀÖ´Ù.
int a = 1;  
Thread A ¿¡¼­ a¸¦ ÀоîµéÀδÙ.  
Thread B ¿¡¼­ a¸¦ ÀоîµéÀδÙ.  
Thread A ¿¡¼­ a = a+1¸¦ ÇÑ´Ù.  
{  
    a = a+1;  
    °á°ú´Â 2;  
}  
Thread B ¿¡¼­ a++¸¦ ÇÑ´Ù.  
{  
   a = a + 1; // ÀоîµéÀÎ °ªÀÌ 1À̱⠶§¹®¿¡  
   ¿ª½Ã °á°ú´Â 2°¡ µÈ´Ù.  
}  
 
µÎ¹øÀÇ count°¡ ¹ß»ýÇ߱⠶§¹®¿¡ 3À̵Ǿî¾ß ÇϰÚÁö¸¸ ÀӰ迵¿ªÀÌ º¸È£µÇÁö ¾ÊÀ½À¸·Î½á 2°¡ µÇ¾î ¹ö·È´Ù.

mutex´Â ÀӰ迵¿ªÀ» Àá±ÝÀ¸·Î¼­ ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇØ°áÇÑ´Ù. ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ­´Â ÀӰ迵¿ª¿¡ ´ÜÁö ÇϳªÀÇ ¾²·¹µå¸¸ Á¢±ÙÇÏ´Â°É º¸ÀåÇØÁà¾ß ÇÒ °ÍÀÌ´Ù. mutex´Â ¾Æ·¡ÀÇ ¿ä¼ÒµéÀ» º¸ÀåÇÔÀ¸·Î½á À̸¦ º¸ÀåÇÑ´Ù.
  • Atomicity - mutex Àá±ÝÀº ÃÖ¼Ò´ÜÀ§ ¿¬Àû - atomic operation - À» º¸ÀåÇÑ´Ù. atomic operation¿¡ ´ëÇØ¼­ °£´ÜÈ÷ ¼³¸íÇÏ°í ³Ñ¾î°£´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº [http]Atomic OperationÀ» Âü°íÇϱ⠹ٶõ´Ù.
    1. aotomic operationÀº ÀÏ·ÃÀÇ ¿¬»ê Áï mutex Àá±Ý ¿¬»êÀÌ ³¡³¯¶§ ±îÁö ´Ù¸¥ ÇÁ·Î¼¼½º°¡ ±× ¿¬»êÀÇ º¯È­¸¦ ¾Ë ¼ö ¾ø´Â »óŰ¡ µÇ´Â ¿¬»êÀ» ÀǹÌÇÑ´Ù. (ÀϹÝÀûÀ¸·Î ¿¬»êÀº ÀÌÀüÀÇ ¿¬»êÀÇ °á°ú¸¦ °üÂûÇÑ ÈÄ¿¡¼­¾ß ÀÌ·ç¾îÁú ¼ö ÀÖ°Ô´Ù)
    2. Àüü¿¬»êÁß Çϳª¶óµµ ½ÇÆÐÇÒ °æ¿ì ¸ðµç ¿¬»êÀÌ ½ÇÆÐÇÏ¸ç ½Ã½ºÅÛÀº Àüü ¿¬»êÀÌ ½ÃÀÛÇϱâ ÀüÀÇ »óÅ·Πº¹±¸µÈ´Ù.
  • Singularity : ÇÑ ¾²·¹µå°¡ ¹ÂÅýº Àá±ÝÀ» ¾ò¾ú´Ù¸é, ÀÌ ¾²·¹µå°¡ ¹ÂÅýº Àá±ÝÀ» ³»¾î³õ±â Àü±îÁö´Â ´Ù¸¥ ¾²·¹µå°¡ ¹ÂÅýº Àá±ÝÀ» ¾òÀ» ¼ö ¾øµµ·Ï ÇÑ´Ù.
  • None Busy Wait : À̰ÍÀº ¼º´É°ú °ü·ÃµÈ °ÍÀÌ´Ù. ¹Ù»Û´ë±â»óÅ¿¡ ³õÀÌÁö ¾Ê´Â´Ù´Â ¶æÀÌ´Ù. ¹ÂÅýº Àá±ÝÀ» ¾òÀ» ¼ö ÀÖ´ÂÁö¸¦ È®ÀÎÇϱâ À§ÇÑ ¿¬»êÀÌ ÇÊ¿äÇÏÁö ¾Ê´Â ´Ù´Â Àǹ̷Π¹Þ¾ÆµéÀÌ¸é µÉ °ÍÀÌ´Ù.

ÀÌ»ó mutex´Â À§ÀÇ 3°¡Áö¸¦ Áö¿øÇÏ´Â °ÍÀ¸·Î °øÀ¯µÇ´Â ÀÚ¿øÀ» Ãæµ¹¾øÀÌ ±×¸®°í È¿À²ÀûÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖµµ·Ï º¸ÀåÇØÁØ´Ù.

´ÙÀ½Àº mutex¸¦ »ç¿ëÇÑ count ¿¹Á¦ÇÁ·Î±×·¥ÀÌ´Ù.
001  #include <stdio.h> 
002  #include <unistd.h> 
003  #include <pthread.h> 
004  
005  int ncount;    // ¾²·¹µå°£ °øÀ¯µÇ´Â ÀÚ¿ø
006  pthread_mutex_t  mutex = PTHREAD_MUTEX_INITIALIZER; // ¾²·¹µå ÃʱâÈ­
007  
008  // ¾²·¹µå ÇÔ ¼ö 1
009  void* do_loop(void *data)
010  {
011      int i;
012  
013      pthread_mutex_lock(&mutex); // Àá±ÝÀ» »ý¼ºÇÑ´Ù.
014      for (i = 0; i < 10; i++)
015      {
016          printf("loop1 : %d", ncount);
017          ncount ++;
018          sleep(1);
019      }
020      pthread_mutex_unlock(&mutex); // Àá±ÝÀ» ÇØÁ¦ÇÑ´Ù.
021  }
022  
023  // ¾²·¹µå ÇÔ¼ö 2
024  void* do_loop2(void *data)
025  {
026      int i;
027  
028      // Àá±ÝÀ» ¾òÀ¸·Á°í ÇÏÁö¸¸ do_loop ¿¡¼­ ÀÌ¹Ì Àá±ÝÀ» 
029      // ¾ò¾úÀ½À¸·Î Àá±ÝÀÌ ÇØÁ¦µÉ¶§±îÁö ±â´Ù¸°´Ù.  
030      pthread_mutex_lock(&mutex); // Àá±ÝÀ» »ý¼ºÇÑ´Ù.
031      for (i = 0; i < 10; i++)
032      {
033          printf("loop2 : %d", ncount);
034          ncount ++;
035          sleep(1);
036      }
037      pthread_mutex_unlock(&mutex); // Àá±ÝÀ» ÇØÁ¦ÇÑ´Ù.
038  }    
039  
040  int main()
041  {
042      int thr_id;
043      pthread_t p_thread[2];
044      int status;
045      int a = 1;
046  
047      ncount = 0;
048      thr_id = pthread_create(&p_thread[0], NULL, do_loop, (void *)&a);
049      sleep(1);
050      thr_id = pthread_create(&p_thread[1], NULL, do_loop2, (void *)&a);
051  
052      pthread_join(p_thread[0], (void *) &status);
053      pthread_join(p_thread[1], (void *) &status);
054  
055      status = pthread_mutex_destroy(&mutex);
056      printf("code  =  %d", status);
057      printf("programing is end");
058      return 0;
059  }
060  

1.9 ¾ÕÀ¸·Î ÇÒ °Í

¾²·¹µå´Â ¸Å¿ì ±¤¹üÀ§ÇÑ ÁÖÁ¦·Î ¿©±â¿¡¼­´Â ¾²·¹µå¸¦ »ç¿ëÇϱâ À§ÇÑ °¡Àå ±âº»ÀûÀÎ ³»¿ë¸¸ ´Ù·ç¾ú´Ù. ¾²·¹µå¿¡ ´ëÇÑ Á»´õ ÀÚ¼¼ÇÑ ³»¿ëÀº º°µµÀÇ ÀåÀ» ÇÒ¾ÖÇØ¼­ ´Ù·ê »ý°¢ÀÌ´Ù.


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