Pthread : µ¿±âÈ­, µ¥ÀÌÅÍ °øÀ¯¿¡ ´ëÇÑ ´õ ÀÚ¼¼ÇÑ ¹®¼­
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



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

<a href="/modules/moniwiki/wiki.php/manSearch?google=none&name=Pthread">Pthread</a>(3) - ´õ ±íÀÌ

Pthread(3) - ´õ ±íÀÌ

À± »ó¹è

dreamyun@yahoo.co.kr



1절. ¼Ò°³

±×µ¿¾È Pthread(1) °ú Pthread(2) ¸¦ ÅëÇØ¼­ pthread ¿¡ ´ëÇÑ ±âº»ÀûÀÎ °³¿ä¿Í »ç¿ë¹æ¹ýÀ» ¾Ë¾Æ º¸¾Ò´Ù. À̹ø¹®¼­´Â pthread ¿¡ ´ëÇÑ Á»´õ ±íÀÌÀÖ´Â ³»¿ë¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.

ÀÌ ¹®¼­¿¡¼­´Â ±×µ¿¾ÈÀÇ Pthread ¹®¼­¿¡¼­ ´Ù·çÁö ¸øÇÑ ¸î°¡Áö À̽´µé°ú ´ÙÁß ¾²·¹µå ÇÁ·Î±×·¡¹Ö½Ã ÇÊ¿ä·ÎÇÏ´Â Condition variables ¸¦ ÅëÇÑ Á»´õ Á¤±³ÇÑ ¾²·¹µå°£ µ¿±âÈ­ ¹æ¹ý¿¡ ´ëÇØ¼­ ´Ù·ç°Ô µÈ´Ù.


2절. ¾²·¹µå Á¾·ù

2.1절. User Space °ú Kernel Space ¾²·¹µå

Pthread ´Â Posix Thread ·Î Posix ¿¡¼­ Ç¥ÁØÀ¸·Î ±Ô°ÝÈ­ÇÑ ¾²·¹µå ¶óÀ̺귯¸®À̸ç, User Space ¿¡¼­ ÀÛµ¿ÇÏ´Â ¾²·¹µå ¶óÀ̺귯¸®ÀÌ´Ù. Áï ¾²·¹µå °ü¸®¸¦ À§Çؼ­ Kernel ÀÌ °ü¿©¸¦ÇÏÁö ¾Ê°í ¾²·¹µå °ü·Ã ¶óÀ̺귯¸®¿¡¼­ ´ëºÎºÐÀÇ ¾²·¹µå °ü¸®¸¦ ó¸®ÇÏ°Ô µÈ´Ù. Kernel ÀÌ Á÷Á¢ ¾²·¹µå¸¦ °ü¸®ÇÏ´Â ¹æ½ÄÀ» Kernel Space ¾²·¹µå ¶ó°í Çϴµ¥, User Space ¾²·¹µå º¸´Ù ºñ¿ëÀÌ Á»´õ ¸¹ÀÌ µå´Â °ü°è·Î ÃÖ±Ù¿¡´Â User Space ¶óÀ̺귯¸®¸¦ Á»´õ ¼±È£ÇÏ´Â ÆíÀÌ´Ù.

Kernel Space ÀÌ User Space ¾²·¹µå º¸´Ù ºñ¿ëÀÌ ´õ ¸¹ÀÌ µç´Ù´Âµ¥ ÀǾÆÇØ ÇÒ¼öµµ ÀÖÀ»°ÍÀÌ´Ù. ÀϹÝÀûÀ¸·Î »ý°¢ÇßÀ»¶§ Kernel Àº Á»´õ ½Ã½ºÅÛ¿¡ °¡±î¿ì¹Ç·Î Á»´õ ºñ¿ëÀÌ Àû°í ºü¸¦°Í À̶ó°í »ý°¢ÇÒ¼ö ÀÖÁö¸¸ ½ÇÀº ±×·¸Áö ¾Ê´Ù. º¸Åë ÀÀ¿ëÇÁ·Î±×·¥Àº 2°¡Áö ·¹º§¿¡¼­ ÀÛµ¿ÇÏ°Ô µÈ´Ù. Çϳª´Â Kernel Space ¸ðµå ÀÌ°í ´Ù¸¥ Çϳª´Â User Space ¸ðµåÀÌ´Ù. ÀÌ·¸°Ô 2°¡Áö ¸ðµå·Î ³ª´©´Â ÀÌÀ¯´Â ÀϹÝÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ½Ã½ºÅÛ¿¡ Á÷Á¢ Á¢±ÙÇÏ´Â ÀÏÀ» ¸·±â À§ÇÔÀ¸·Î, ÀÏ¹Ý ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ½Ã½ºÅÛ¿¡ Á¢±ÙÇϱâ À§Çؼ­´Â System Call À» ºÒ·¯¼­ Kernel ¿¡°Ô ½Ã½ºÅÛÀÚ¿øÀ» »ç¿ëÇÒ°ÍÀ» ¿äûÇÏ´Â ¹æ½ÄÀ¸·Î °£Á¢ Á¢±ÙÇØ¾ß ÇÑ´Ù. À̶§ Ä¿³ÎÀº º¸È£¸ðµå »óÅ¿¡¼­ System Call À» ó¸®ÇØ¾ß ÇϹǷΠ¿©·¯°¡Áö ¿¬»êÀ» °¡Áö°Ô µÇµÈ´Ù. ÃÖÁ¾ÀûÀ¸·Î User ¸ðµå¿¡¼­ Kernel ¸ðµå·Î ÀüȯÇϴµ¥ µå´Âºñ¿ë, º¸È£¸ðµå¸¦ À§ÇÑ ¿©·¯°¡Áö ¿¬»êÀ» Çϴµ¥ µå´Â ºñ¿ëµî 3°¡ÁöÀÇ ºñ¿ëÀ» ¼ÒºñÇÏ°Ô µÈ´Ù.

¹Ý¸é User Level ¾²·¹µå´Â ´ëºÎºÐÀÇ ÀÛ¾÷À» system call À» »ç¿ëÇÏÁö ¾Ê°í »ç¿ëÀÚ¶óÀ̺귯¸® ¿¡¼­ ´ëºÎºÐ ó¸®ÇϹǷΠKernel Level ¾²·¹µå°¡ °¡Áö´Â ºñ¿ëÀ» ÁÙÀϼö ÀÖ´Ù. ´ÜÁ¡À̶ó¸é Kernel Level ¾²·¹µå°¡ °¢ ¾²·¹µå¸¦ º¸È£ÇØÁÖ´Â ¹Ý¸é À¯Àú·¹º§ ¾²·¹µå´Â º¸È£¸¦ ¹ÞÀ»¼ö ¾ø´Ù´Â Á¡ÀÌ´Ù. ±×·¯¹Ç·Î À¯Àú·¹º§¾²·¹µå »ç¿ë½Ã¿¡´Â °¢ ¾²·¹µå¸¦ º¸È£Çϱâ À§ÇÑ ¿©·¯°¡Áö µ¿±âÈ­ ÀåÄ¡µîÀ» »ç¿ëÇØ¾ß Çϸç, À̰ÍÀº ¶§¶§·Î ¼¼¹ÐÇÏ°í º¹ÀâÇÑ ÄÚµù ±â¹ýÀ» ¿ä±¸ÇÑ´Ù.

¾î¶µç ÇöÀç Unix ÂÊÀº Pthread ¸¦ Ç¥ÁØÀ¸·Î °¡Á®°¡´Â°Í °°´Ù.


2.1.1절. User Space¾²·¹µå

¾²·¹µå¸¦ À¯ÁöÇϱâ À§Çؼ­´Â ¿©·¯°¡Áö Á¤º¸¸¦ ÇÊ¿ä·Î ÇÑ´Ù. ÀÌ·¯ÇÑ Á¤º¸´Â "ÇÁ·Î±×·¥ ÄÚµå", Data, Stack, File I/O, Signal Å×ÀÌºí µî Å©°Ô 5°¡ÁöÀÌ´Ù. User Space ¾²·¹µå´Â ÀÌ·¯ÇÑ Á¤º¸¸¦ Ä¿³Î¿¡¼­ °ü¸®Çϵµ·Ï ÇÏÁö ¾Ê°í ¾²·¹µå ¶óÀ̺귯¸®¿¡¼­ Á÷Á¢ ó¸®ÇÏ°Ô µÈ´Ù. ¶ÇÇÑ °¢ ¾²·¹µå°£ Çù·ÂÀÌ °¡´ÉÇϵµ·Ï switch ±â´ÉÀ» Á¦°øÇϴµ¥, Ä¿³Î¾²·¹µåº¸´Ù ÀϹÝÀûÀ¸·Î ºü¸¥ switch ±â´ÉÀ» Á¦°øÇÑ´Ù.

´ÜÁ¡Àº SMPs(Symmetric MultiProcessor system)ÀÇ ÀåÁ¡µéÀ» ÀÌ¿ëÇÒ¼ö ¾ø´Ù´Â °ÍÀÌ´Ù. Áï dual ȤÀº quad ÀÇ cpu¸¦ »ç¿ëÇϰí ÀÖ´Â ½Ã½ºÅÛÀ̶ó ÇÒÁö¶óµµ, User Space ¾²·¹µå·Î´Â ÁøÁ¤ÇÑ ¸ÖƼ¾²·¹µå ÇÁ·Î±×·¡¹ÖÀ» ÇÒ¼ö ¾ø´Ù´Â °ÍÀÌ´Ù. ¿ÀÁ÷ ÇϳªÀÇ CPU¿¡¼­¸¸ ÀÛµ¿ÇÒ¼ö ÀÖÀ»»ÓÀÌ´Ù. ±×·¯¹Ç·Î ¼³»ç CPU°¡ 2°³ ȤÀº 4°³ ÀÖ´Ù°í ÇÏ´õ¶óµµ, ¼öÇà¼ÓµµÂ÷ÀÌ´Â ±×¸® Å©Áö ¾Ê°Ô µÈ´Ù. ¶ÇÇÑ ÇϳªÀÇ ¾²·¹µå¿¡¼­ I/O ºÀ¼â°¡ ÀϾ°Ô µÇ¸é ´Ù¸¥ ¸ðµç ¾²·¹µå±îÁö ºÀ¼âµÇ°Ô µÈ´Ù.

¹°·Ð ÀÌ·¯ÇÑ ¹®Á¦µéÀ» À§ÇÑ ÇØ¹ý¿ª½Ã Á¸ÀçÇÑ´Ù. I/O ºÀ¼â¸¦ ¾Æ¿¹ ¶óÀ̺귯¸® Â÷¿ø¿¡¼­ ÇØ°áÇÒ¼ö ÀÖµµ·Ï µµ¿ÍÁÖ´Â ¾²·¹µå ¶óÀ̺귯¸®µµ ÀÖÀ¸¸ç, I/O ÀÛ¾÷À» ºñºÀ¼â ¸ðµå·Î ÀÛ¾÷ÇÔÀ¸·Î½á ºÀ¼â¸¦ ¸·À»¼öµµ ÀÖ´Ù. ±×¸®°í ¸î¸îÀÇ SMPs ´Â User Space ¾²·¹µå·Îµµ ¸ðµç SMP ÀÚ¿øÀ» ÀÌ¿ëÇÒ¼ö ÀÖµµ·Ï ¹æ¹ýÀ» Á¦°øÇØ Áֱ⵵ ÇÑ´Ù.


2.1.2절. Kernel Space ¾²·¹µå

Ä¿³Î¿¡¼­ Á÷Á¢ ¾²·¹µå¸¦ °ü¸®Çϸç, Ä¿³ÎÀÚü¿¡¼­ ¾²·¹µå Á¤º¸¸¦ °¡Áø´Ù. ¶ÇÇÑ °¢ ÇÁ·Î¼¼½º °£ÀÇ ½ºÄÉÁ쿪½Ã Ä¿³Î¿¡¼­ ¸Ã´Â´Ù. À̰æ¿ì I/O ºÀ¼â°°Àº ¹®Á¦´Â ½Å°æ¾²Áö ¾Ê¾Æµµ µÇ¸ç, ¶ÇÇÑ SMPs ÀÚ¿øÀ» Á¦´ë·Î Ȱ¿ëÇÒ¼ö ÀÖ´Ù´Â ÀåÁ¡À» °¡Áø´Ù.


3절. Pthread ¿¡¼­ÀÇ ¼¼¹ÐÇÑ µ¿±âÈ­

¿ì¸®´Â ÀÌÀüÀÇ Pthread(2) ¹®¼­¿¡¼­ mutex Àá±ÝÀ» ÀÌ¿ëÇÑ µ¥ÀÌŸ µ¿±âÈ­¿¡ ´ëÇØ¼­ ÀÌ¹Ì ¾Ë¾Æº¸¾Ò´Ù. ±×·¯³ª mutex ´Â ¾îµð±îÁö³ª Àá±ÝÀ» À§ÇÑ °ÍÀ¸·Î µ¿±âÈ­½Ãų¼ö ÀÖ´Â ¹üÀ§´Â Á¼Àº ¹üÀ§·Î ÇÑÁ¤µÇ¸ç, mutex ¸¸ °¡Áö°í´Â ¼¼¹ÐÇÑ ¼öÁØ¿¡¼­ÀÇ µ¿±âÈ­´Â ¾î·Æ´Ù. ±×·¡¼­ mutex ¿Í ´õºÒ¾î ´Ù¸¥ ¾²·¹µå µµ±¸¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. À̹øÀå¿¡¼­´Â Condition variables (Á¶°Çº¯¼ö) ¿Í mutex ¸¦ ÀÌ¿ëÇÑ µ¥ÀÌÅÍ µ¿±âÈ­¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.


3.1절. Á¶°Çº¯¼ö

¹ÂÅØ½º°¡ Àá±Ý¿¡ ÀÇÇØ¼­ ¼Ò±ØÀûÀÎ µ¿±âÈ­¸¦ Á¦°øÇÑ´Ù¸é, Á¶°Çº¯¼ö´Â "½Ã±×³Î ¹ß»ý"°ú "½Ã±×³Î¿¡ ´ëÇÑ ±â´Ù¸²" À» ÅëÇÑ Á»´õ Àû±ØÀûÀÎ µ¿±âÈ­ ¹æ¹ýÀ» Á¦°øÇÑ´Ù. ÀÌ·¯ÇÑ ½Ã±×³ÎÀ» ±â´Ù¸®±â À§Çؼ­ pthread_cond_wait() ¿Í pthread_cond_timedwait() 2°³ÀÇ ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù. ÀÌ ÇÔ¼öµéÀº pthread_cond_signal()¿¡ ÀÇÇØ¼­ ¹ß»ýµÇ´Â ½Ã±×³ÎÀ» ±â´Ù¸®°í ÀÖ´Ù°¡. ½Ã±×³ÎÀÌ µµÂøÇÏ¸é ±â´Ù¸²À» ¸ØÃß°í ´ÙÀ½ ·çƾÀ» ½ÇÇàÇÏ°Ô µÈ´Ù. ÀÌ·¯ÇÑ ½Ã±×³ÎÀÇ Àü´ÞÀº "Á¶°Çº¯¼ö" ¸¦ ÅëÇØ¼­ ÀÌ·ç¾îÁö°Ô µÈ´Ù. ¾Æ·¡´Â ÀÌ·¯ÇÑ ¼ø¼­¸¦ °£·«ÇÏ°Ô Á¤¸®ÇÑ °ÍÀÌ´Ù(½´µµÄÚµåÇü½Ä).

ÀӰ迵¿ª¿¡ µé¾î°£´Ù. 
{
    ¿äûÀ» ±â´Ù¸°´Ù.(pthread_cond_wait ¸¦ ÀÌ¿ëÇØ¼­ singalÀÌ µµÂøÇÏ´ÂÁö È®ÀÎÇÑ´Ù) 
    ¸¸¾à ¿äûÀÌ µµÂøÇÑ´Ù¸é (¿äû¿¡ ´ëÇÑ ÇØ°áÀÌ ³¡³¯¶§ ±îÁö ¿äû¿µ¿ªÀ» ÀӰ迵¿ªÀ¸·Î ¼³Á¤ÇÑ´Ù)
    {
        ¿äûÀ» ÇØ°áÇÑ´Ù. 
    }
}
ÀӰ迵¿ªÀ» ºüÁ®³ª¿Â´Ù. 
			
ÀӰ迵¿ª¿¡ ÁøÀÔÇÏ°í ºüÁ®³ª¿À´Â °ÍÀº mutex ¸¦ »ç¿ëÇÑ´Ù. À§ÀÇ ½´µµÄڵ带 º¸¸é ´Ü¼øÈ÷ Àá±Ý¸¸À» Á¦°øÇϴ°ÍÀÌ ¾Æ´Ñ, ¿äû/ÇØ°á ÀÇ ¼­¹ö/Ŭ¶óÀÌ¾ðÆ® ¸ðµ¨À» ±¸ÇöÇÒ¼ö ÀÖÀ¸¸ç, ´ÙÁßÀÇ ¿äû/ÇØ°á¿¡ ´ëÇÑ µ¿±âÈ­ ¹®Á¦±îÁö ÇØ°áÇÒ¼ö ÀÖÀ½À» ¾Ë¼ö ÀÖ´Ù.


3.1.1절. Á¶°Çº¯¼ö »ý¼º¹× ÃʱâÈ­

Á¶°Çº¯¼ö´Â pthread_cont_t ÀÇ Å¸ÀÔÀ¸·Î ¼±¾ðµÇ¾î ÀÖ´Ù. pthread_cond_t ´Â ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÇ¾î ÀÖ´Ù.

typedef struct
{
    struct _pthread_fastlock __c_lock;  // ±¸Á¶Ã¼ÀÇ Àá±ÝÀ» À§Çؼ­ »ç¿ëµÈ´Ù.
    _pthread_descr __c_waiting;         // ¾²·¹µå´Â ÀÌ °ªÀÇ »óź¯È­¸¦ ±â´Ù¸°´Ù. 
} pthread_cond_t 
				
pthread_cont_t ÀÇ ÃʱâÈ­¸¦ À§ÇÑ ¹æ¹ýÀº 2°¡Áö°¡ ÀÖ´Ù. ù¹øÂ°´Â ÇÁ·Î±×·¥ÀÇ ½ÃÀ۽ÿ¡ ¼±¾ðÇϰí ÃʱâÈ­ ÇØ¹ö¸®´Â ¹æ¹ý°ú, ÇÁ·Î±×·¥ ½ÇÇàÁß¿¡ ÇÔ¼ö¸¦ È£ÃâÇØ¼­ »ç¿ëÇÏ´Â ¹æ¹ýÀÌ ÀÖ´Ù. ÇÁ·Î±×·¥ ½ÃÀ۽ÿ¡ ¼±¾ðÇØ¼­ »ç¿ëÇϱâ À§Çؼ­´Â ´ÙÀ½°ú °°Àº ¹æ¹ýÀ» »ç¿ëÇÑ´Ù.
pthread_cond_t       thread_con1 =   PTHREAD_COND_INITIALIZER;
				
PTHREAD_COND_INITIALIZER Àº {__LOCK_INITIALIZER, 0} À¸·Î µðÆÄÀÎ µÇ¾î ÀÖ´Ù. À§ÀÇ ÃʱâÈ­¸¦ »ç¿ëÇÏ°Ô µÇ¸é pthread_cont_t ±¸Á¶Ã¼¸¦ À§ÀÇ °ªÀ¸·Î ÃʱâÈ­ ÇÏ°Ô µÈ´Ù. ¶Ç´Ù¸¥ ¹æ¹ýÀº ÇÁ·Î±×·¥ ½ÃÇàÁß¿¡ »ç¿ëÇÏ´Â ¹æ¹ýÀ¸·Î pthread_cond_init() ÇÔ¼ö¸¦ »ç¿ëÇÏ¸é µÈ´Ù.


3.1.2절. Á¶°Çº¯¼ö¿¡ ½ÅÈ£ º¸³»±â

¿ì¸®´Â Á¶°Çº¯¼ö¿¡ ½ÅÈ£¸¦ º¸³¿À¸·Î½á, Á¶°Çº¯¼ö¸¦ (½ÅÈ£¸¦)±â´Ù¸®´Â ´Ù¸¥ ¾²·¹µå¸¦ ±ú¿ï¼ö ÀÖ°Ô µÈ´Ù. º¸ÅëÀº ÀÌ·¯ÇÑ ½ÅÈ£¸¦ º¸³»¼­ ±ú¿ì°íÀÚ ÇÏ´Â ¾²·¹µå°¡ ÇϳªÀϼöµµ ÀÖÁö¸¸, µ¿½Ã¿¡ ¿©·¯°³ÀÇ ¾²·¹µå¸¦ ±ú¿ö¾ßÇÒ Çʿ䵵 ÀÖÀ»°ÍÀÌ´Ù. ´ÙÀ½Àº ÀÌ·¯ÇÑ ½Ã±×³ÎÀ» º¸³»´Â ÇÔ¼öµéÀÌ´Ù.

int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond);
				
pthread_cond_signal() Àº ÇϳªÀÇ ¾²·¹µå¸¦ ±ú¿ì±â À§ÇÑ, pthread_cond_broadcast() ´Â ¸ðµç ¾²·¹µå¸¦ ±ú¿ì±â À§ÇÑ ½ÅÈ£¸¦ º¸³»±â À§Çؼ­ »ç¿ëµÈ´Ù.

¼º°øÀûÀ¸·Î ½Ã±×³ÎÀÌ Àü´ÞµÇ¸é 0ÀÌ ¸®ÅϵȴÙ.


3.1.3절. Á¶°Çº¯¼ö¸¦ ÅëÇÑ ½ÅÈ£ ±â´Ù¸®±â

½ÅÈ£¸¦ º¸³»´Â ¾²·¹µå°¡ ÀÖ´Ù¸é, ÀÌ ½ÅÈ£¸¦ ¹Þ±â À§ÇØ ±â´Ù¸®´Â ¾²·¹µåµµ ÀÖ¾î¾ß ÇÒ°ÍÀÌ´Ù. ½ÅÈ£¸¦ ¹Þ±â À§Çؼ­´Â pthread_cond_wait()¿Í pthread_cond_timewait() µÎ°³ÀÇ ÇÔ¼ö°¡ »ç¿ëµÈ´Ù. À̵ΰ³ÀÇ ÇÔ¼ö´Â ½ÅÈ£°¡ Àü´ÞµÉ¶§±îÁö ±â´Ù¸®°Ô µÈ´Ù.

int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime);
				
ù¹øÂ° ¾Æ±Ô¸ÕÆ®´Â ½ÅÈ£¸¦ ±â´Ù¸®±â À§ÇÑ "Á¶°Çº¯¼ö" À̸ç 2¹øÂ°´Â mutext º¯¼öÀÌ´Ù. ÀÌ µÎ°³ÀÇ ÇÔ¼ö´Â ½ÇÇàµÇ¸é mutext Àá±ÝÀ» Ç®°í(unlock) ½ÅÈ£¸¦ ±â´Ù¸°´Ù. ±×·¯´Ù°¡ ½ÅÈ£°¡ Àü´ÞµÇ¸é ¹ÂÅØ½º Àá±ÝÀ» ¾òÀº ´ÙÀ½ ÇØ´ç¿µ¿ªÀ» ½ÇÇàÇÏ°Ô µÈ´Ù.

pthread_cond_wait() ¿Í pthread_cond_timedwait() ÀÇ ´Ù¸¥Á¡Àº timeout À» ±â´Ù¸®´ÂÁö¿¡ µû¶ó¼­ ±¸º°µÈ´Ù. pthread_cond_timedwait ´Â ±â´Ù¸²ÀÇ ½Ã°£À» ¼³Á¤ÇÏ¿©¼­ ÀÏÁ¤ÇÑ ½Ã°£µ¿¾È ½Ã±×³ÎÀÌ µµÂøÇÏÁö ¾ÊÀ¸¸é ETIMEDOUT °ªÀ» ¸®ÅÏÇÑ´Ù. ¹Ý¸é pthread_cond_wait ´Â ½Ã±×³ÎÀÌ µµÂøÇÒ¶§±îÁö ¹«ÇÑÁ¤ ±â´Ù¸°´Ù.

Áö±Ý±îÁöÀÇ ¼³¸íÇÑ ³»¿ëÀÇ ÀÌÇØ¸¦ µ½±â À§ÇØ °£´ÜÇÑ È帧µµ¸¦ ±×·Áº¸¾Ò´Ù. ¾Æ·¡ÀÇ È帧µµ´Â pthread_cond_wait()¸¦ »ç¿ëÇßÀ»°æ¿ì´Ù.

// ¹ÂÅØ½º ¿Í Á¶°Çº¯¼ö¸¦ ÃʱâÈ­ ÇÑ´Ù.  
pthread_mutext_t     request_lock = PTHREAD_MUTEX_INITILIZER;
pthread_cond_t       producer_cv  = PTHREAD_COND_INITIALIZER;

// ÀÓ°è ¿µ¿ª¿¡ ´ëÇÑ ¹ÂÅØ½º Àá±ÝÀ» ¾ò´Â´Ù. 
int rc;
rc = pthread_mutext(&mutext_a);
if (rc)
{
    perror("mutext lock error "); 
    phread_exit(NULL);
}

// Á¶°Çº¯¼ö producer_cv ¿¡ ´ëÇÑ ½Ã±×³ÎÀ» ±â´Ù¸°´Ù.  
// wait ¿¡ µé¾î°¡±âÀü¿¡ mutext ´Â request_lock¿¡ ´ëÇÑ Àá±ÝÀ» 
// ¾ò´Â´Ù. 
mutext_rc1 = pthread_cond_wait(&producer_cv,&request_lock)
if
{
    // mutext Àá±ÝÀÌ ÀÌ·ç¾îÁø´Ù.  
    // ÄÚµå ½ÇÇà
}

// ¹ÂÅØ½º Àá±ÝÀ» µ¹·ÁÁØ´Ù. 
pthread_mutex_unlock(&request_lock);
				

´ÙÀ½Àº pthread_cond_timedwait()¸¦ »ç¿ëÇßÀ»¶§ÀÇ È帧µµÀÌ´Ù. pthread_cond_wait()¿Í ºñ±³Çؼ­ ½Ã°£¼³Á¤À» À§ÇѺκÐÀÌ µé¾î°¡°í, ŸÀӾƿôÀÌ ¹ß»ýÇßÀ»¶§ ó¸®ÇÏ´Â ºÎºÐÀÌ µé¾î°¡´Â°É »©°í´Â ³ª¸ÓÁö ºÎºÐÀº µ¿ÀÏÇÏ´Ù.

...
struct timeval  now;
struct timespec timeout;
int    done;
...
rc = pthread_mutext(&mutext_a);
if(rc)
{
   ...
}

// timeout ½Ã°£ ¼³Á¤À» À§Çؼ­ »ç¿ëÇÑ´Ù. 
gettimeofday(&now);
timeout.tv_sec = noew.tv_sec + 5
timeout.tv_nsec = now.tv_usec * 1000;

// timeout ½Ã°£µ¿¾È signal À» ±â´Ù¸°´Ù. 
rc = pthread_cond_timedwait(&got_request, &request_mutext, &timeout);

// pthread_cond_timedwait °¡ ³Ñ°ÜÁØ °ªÀ» ÀÌ¿ëÇØ¼­ ºÐ±âÇÑ´Ù. 
switch(rc)
{
    // ½Ã±×³ÎÀÌ ¹ß»ýÇßÀ»¶§.. 
    case 0:
        ...
        break;
    // timeout µ¿¾È ½Ã±×³ÎÀÌ ¹ß»ýÇÏÁö ¾Ê¾ÒÀ»°æ¿ì
    case ETIMEDOUT:
        ...
        break;
    // ±×¹ÛÀÇ °æ¿ì(¿¡·¯)
    default:  
        ...
        break;
}
pthread_mutext_unlock(&request_mutex);
				


3.1.4절. Á¶°Ç º¯¼ö ¾ø¾Ö±â(Destory)

´õÀÌ»ó »ç¿ëÇÒ Çʿ䰡 ¾ø´Â Á¶°Çº¯¼ö´Â ¾ø¾ÖÁÖµµ·Ï ÇÏÀÚ. ÀÌ·¸°Ô ÇÔÀ¸·Î½á ½Ã½ºÅÛÀÚ¿øÀÇ ³¶ºñ¸¦ ¸·À»¼ö ÀÖ´Ù. Á¶°Çº¯¼ö¸¦ ¾ø¾Ö±â À§Çؼ­´Â pthread_cond_destroy() ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ´Ù. Á¶°ßº¯¼ö¸¦ ¾ø¾Ö±â Àü¿¡ Á¶°Çº¯¼ö¸¦ »ç¿ëÇÏ´Â ¾²·¹µå°¡ ¾øÀ½À» È®ÀÎÇØ¾ß ÇÑ´Ù.

// Á¶°Çº¯¼ö got_request ¸¦ »èÁ¦ÇÑ´Ù. ¸®ÅϰªÀÌ EBUSYÀϰæ¿ì´Â 
// ¾ÆÁ÷ »ç¿ëÇÏ´Â ¾²·¹µå°¡ ÀÖÀ¸¼­ Á¶°Çº¯¼ö »èÁ¦¿¡ ½ÇÆÐÇßÀ»°æ¿ìÀÌ´Ù. 
int rc = pthread_cond_destory(&got_request);
if (rc == EBUSY)
{
    ....
}
				


4절. Thread-Specific Data

4.1절. ¾²·¹µå°£ Àü¿ªº¯¼ö »ç¿ëÀÇ ¹®Á¦Á¡

ÀϹÝÀûÀÎ ´ÜÀÏ ¾²·¹µå ÇÁ·Î±×·¡¹ÖÀ» ÇÒ¶§, (ºñ·Ï ±ÇÀåÇÏÁö´Â ¾ÊÁö¸¸) Àü¿ªº¯¼ö¸¦ »ç¿ëÇÏ´Â °æ¿ì°¡ Á¾Á¾ ÀÖÀ»°ÍÀÌ´Ù. Àü¿ªº¯¼ö¸¦ ¾¸À¸·Î½á ±×·¸Áö ¾ÊÀ»¶§ º¸´Ù Äڵ带 ÈξÀ ½±°Ô ±â¼úÇÒ¼öµµ Àֱ⶧¹®ÀÌ´Ù.

¸ÖƼ¾²·¹µå ÇÁ·Î±×·¥¿¡¼­µµ ÀÌ·¯ÇÑ Àü¿ª º¯¼ö°¡ ÇÊ¿äÇÒ¶§°¡ ÀÖ´Ù. ±×·±µ¥ Àü¿ªº¯¼ö¸¦ ¾²´Âµ¥ ¾à°£ÀÇ ¹®Á¦°¡ ¹ß»ýÇÑ´Ù. ÀÌÀ¯´Â ¸ðµç ¾²·¹µå°¡ Àü¿ªº¯¼ö¸¦ °øÀ¯ÇØ ¹ö¸®±â ¶§¹®¿¡, ¾²·¹µåº° Àü¿ªº¯¼ö¸¦ »ç¿ëÇÒ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. fork() ¸¦ ÀÌ¿ëÇÑ ¸ÖƼ ÇÁ·Î¼¼½º ¸ðµ¨¿¡¼­´Â ÇÁ·Î¼¼½º°£ Àü¿ªº¯¼ö °øÀ¯°¡ µÇÁö ¾Ê±â ¶§¹®¿¡, °¢ ÇÁ·Î¼¼½º °³º°ÀûÀÎ Àü¿ªº¯¼ö¸¦ »ç¿ëÇÒ¼ö Àִ°Ͱú´Â ´ëÁ¶ÀûÀÌ´Ù.

±×·³ ¾î¶»°Ô ÇØ¾ßÁö ¾²·¹µå °³º°ÀûÀ¸·Î Àü¿ªº¯¼ö¸¦ »ç¿ëÇÏ°Ô ÇÒ¼ö ÀÖ´ÂÁö ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.


4.2절. Thread-Specific Data

4.2.1절. Thread-Specific Data ÀÇ °³³ä

ÀÌ·¯ÇÑ ¹®Á¦ÀÇ ÇØ°áÀ» À§ÇØ µîÀåÇѰÍÀÌ, Thread-Specific Data (ÀÌÇÏ TSD)ÀÌ´Ù. °°Àº Àü¿ªº¯¼ö°¡ ¼­·Î ´Ù¸¥ ¸Þ¸ð¸® ¿µ¿ªÀ» °¡¸£Å°°Ô ÇÏ´Â ¹æ¹ýÀ» »ç¿ëÇϴµ¥, ´Ù¸¥ ¸Þ¸ð¸® ¿µ¿ªÀÇ ÁÖ¼Ò¸¦ °¡¸®Å°´Â °¢°¢ÀÇ ´Ù¸¥ key ¸¦ »ç¿ëÇÔÀ¸·Î½á, ¾²·¹µå°£ °³º°ÀûÀÎ Àü¿ªº¯¼ö¸¦ ¿¢¼¼½ºÇϰԲû ¸¸µé¾îÁØ´Ù.

À̰ÍÀº °£´ÜÇÑ µ¥ÀÌŸº£À̽º ÇüÅÂÀÎ key-value °ü°è·Î ³ªÅ¸³¾¼ö Àִµ¥, °¢°¢ÀÇ key ¿¡ À̸§À» ºÎ¿©Çϰí ÀÌ key °¡ value ¸¦ °¡¸®Å²´Ù. ÀÌ value ´Â ¸Þ¸ð¸® ¿µ¿ªÀÌ µÉ°ÍÀÌ´Ù.

+-----------------------------------+
| Process                           |
|                                   |
|     Global_data                   |
|     +-------+-------+-------+     |
|     | data1 | data2 | data3 |     |
|     +-------+-------+-------+     |
|     ^       ^       ^             |
|     |       |       |             |
|     |       |       |             |
|    key1    key2    key3           |
|     |       |       |             |
|   +---+   +---+   +---+           |
|   |   |   |   |   |   |           |
|   | A |   | B |   | C |           |
|   +---+   +---+   +---+           |
+-----------------------------------+
				
À§ÀÇ ±×¸²Àº ¾²·¹µå A, B, C°¢ ÇϳªÀÇ Àü¿ªº¯¼öÀÎ Global_data ¿¡ ¾î¶»°Ô ÀڽŸ¸ÀÇ Àü¿ªµ¥ÀÌŸ¸¦ ÀÐ°í ¾µ¼ö ÀÖ´ÂÁö¿¡ ´ëÇÑ °³³äÀ» ³ªÅ¸³½°ÍÀÌ´Ù.


4.2.2절. TSD ºí·°ÀÇ ÇÒ´ç(»ý¼º)

pthread_key_create() ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ¸ðµç ¾²·¹µå¿¡¼­ È¿·ÂÀ» °¡Áö´Â »õ·Î¿î key¸¦ ÇÒ´ç¹ÞÀ»¼ö ÀÖ´Ù. ÃÖÃÊ¿¡ key ¸¦ ¸¸µé°Ô µÇ¸é ÀÌ key ´Â ±âº»ÀûÀ¸·Î NULLÀ» °¡¸£Å°°Ô µÈ´Ù. ³ªÁß¿¡ ¾²·¹µå´Â ÀÌ key °ªÀ» º¯°æÇÏ°Ô µÊÀ¸·Î½á ÀÚ½ÅÀÌ ¿øÇÏ´Â ¸Þ¸ð¸® ¿µ¿ªÀ» ÂüÁ¶ÇÒ¼ö ÀÖ°Ô µÈ´Ù. ´ÙÀ½Àº ÀÌ ÇÔ¼ö°¡ ¾î¶»°Ô »ç¿ëµÇ´ÂÁö¿¡ ´ëÇÑ °£´ÜÇÑ ¿¹ÀÌ´Ù. pthread_key_t ´Â unsigned int ÇüÀÌ´Ù.

int rc;
pthread_key_t list_key;

// clean_list ´Â »ç¿ëÀÚ Á¤ÀÇ ÇÔ¼ö·Î, ³ªÁß¿¡ µ¥ÀÌŸ°¡ ÇÊ¿ä¾øÀ»¶§ 
// µ¥ÀÌŸ¸¦ Á¦°Å(free) Çϱâ À§Çؼ­ ÇÊ¿äÇÑ ÇÔ¼öÀÌ´Ù. 
extern void* clean_list(void*); 

// key ¸¦ »ý¼ºÇÏ¸ç µ¥ÀÌŸ Á¦°Å¸¦ À§ÇÑ ÇÔ¼ö¸¦ ÁöÁ¤ÇØÁØ´Ù. 
// cleanup_list ÇÔ¼ö´Â NULL ·Î ÁöÁ¤µÉ¼öµµ ÀÖÀ¸¸ç, 
// À̰æ¿ì ³ªÁß¿¡ key ¸¦ »èÁ¦ÇÏ´õ¶óµµ µ¥ÀÌÅͰ¡ Á¦°ÅµÇÁö´Â ¾Ê´Â´Ù. 
rc=pthread_key_create(&list_key, cleanup_list);
				
pthread_key_create()¸¦ ½ÇÇàÇÑÈÄ¿¡ list_key ´Â »õ·Î ¸¸µé¾îÁø key ¸¦ °¡¸£Å²´Ù. pthread_key_create ´Â ¼º°øÀûÀ¸·Î ½ÇÇàµÉ°æ¿ì 0À» ¹ÝȯÇÏ°í ±×·¸Áö ¾ÊÀ»°æ¿ì¿¡´Â Àû´çÇÑ ¿¡·¯Äڵ带 ¹ÝȯÇϵµ·Ï µÇ¾îÀÖ´Ù. »ý¼ºÇÒ¼ö ÀÖ´Â key ÀÇ ¼ýÀÚ´Â Á¦ÇѵǾî Àִµ¥, »ý¼ºÇÒ¼ö ÀÖ´Â ÃÖ´ëÅ©±â´Â PTHREAD_KEYS_MAX ¿¡ Á¤ÀÇ µÇ¾î ÀÖ´Ù. À̰ªÀº OS ¸¶´Ù ´Ù¸¦¼ö ÀÖÀ¸¸ç º¸Åë 1024 ÀÇ Å©±â¸¦ °¡Áø´Ù.


4.2.3절. TSD ºí·° ¿¡ ´ëÇÑ Access

key ¸¦ ¸¸µé¾ú´Ù¸é ÀÌÁ¦ value ¿¡ ¿¢¼¼½º¸¦ ÇØ¾ß ÇÑ´Ù. ¿¢¼¼½º¸¦ À§Çؼ­ pthread_getspecific()¿Í pthread_setspecific()µÎ°³ÀÇ ÇÔ¼ö°¡ Á¦°øµÈ´Ù. ù¹øÂ° ÇÔ¼ö´Â key ¿¡ ´ëÇÑ value¸¦ °¡Á®¿À±â À§Çؼ­ »ç¿ëµÇ¸ç, µÎ¹øÂ° ÇÔ¼ö´Â key ¿¡ value ¸¦ ¼¼ÆÃÇϱâ À§Çؼ­ »ç¿ëµÈ´Ù. value ´Â (void *)ÇüÀ¸·Î ¿øÇÏ´Â ¾î¶² µ¥ÀÌŸ¶óµµ ³Ñ±æ¼ö ÀÖµµ·Ï µÇ¾îÀÖ´Ù. ´ÙÀ½Àº °£´ÜÇÑ »ç¿ë ¿¹ÀÌ´Ù.

    
phtread_key_t a_key;
int rc;

int *p_num = (int *)malloc(sizeof(int));
(*p_num) = 4;

rc = pthread_setspecific(a_key, (void *)p_num);
...
// ¸¸¾à a_key ¿¡ ´ëÇØ¼­ p_num °ªÀ» °¡Á®¿À°í ½Í´Ù¸é
{
   int *p_keyval = (int *)pthread_getspecific(a_key);

   if (p_keyval != NULL)
   {
      printf("value of 'a_key' is: %d\n", *p_keyval);
   }
}
				


4.2.4절. TSD ºí·° »èÁ¦

´õÀÌ»ó »ç¿ëÇÒ Çʿ䰡 ¾ø´Â TSD ºí·°Àº pthread_key_delete()¸¦ ÀÌ¿ëÇØ¼­ »èÁ¦ÇÑ´Ù. ÁÖÀÇ ÇÒ°ÍÀº À̰ÍÀº key ¸¦ »èÁ¦ÇÏ´Â °ÍÀÌÁö ½ÇÁ¦ µ¥ÀÌŸÀÇ ¸Þ¸ð¸®¸¦ »èÁ¦ÇÏÁö´Â ¾Ê´Â´Ù´Â °ÍÀÌ´Ù. µ¥ÀÌŸ ¸Þ¸ð¸®ÀÇ »èÁ¦´Â pthread_key_create() ·Î key ¸¦ ¸¸µé¶§ ÁöÁ¤ÇÑ µ¥ÀÌŸ »èÁ¦ ÇÔ¼ö°¡ ÀÌ¿ëµÈ´Ù. ¸¸¾à µ¥ÀÌŸ »èÁ¦ ÇÔ¼ö°¡ NULL ÀÌ¿´´Ù¸é µ¥ÀÌŸ »èÁ¦´Â ÀϾÁö ¾ÊÀ»°ÍÀÌ´Ù.

int rc = pthread_key_delete(key);
				


5절. °á·Ð

Áö±Ý±îÁö Pthread ¿¡ ´ëÇÑ ¸î°¡Áö À̽´µéÀ» »ìÆìº¸¾Ò´Âµ¥, ¿©ÀüÈ÷ ´Ù·çÁö ¸øÇÑ »çÇ×µéÀÌ ÀÖ½À´Ï´Ù. ±×¸®°í ½ÇÁ¦·Î ¾î¶»°Ô ÀÀ¿ëÀÌ °¡´ÉÇÑÁö¿¡ ´ëÇÑ ¹æÇâÁ¦½Ãµµ Á» ¹Ì¾àÇϱ¸¿ä. ÀÌ·¯ÇÑ ºÎÁ·ÇÑ Á¡µéÀº ³ªÁß¿¡ ´Ù·ç°Ô µÉ "´ÙÁß ¿¬°á ¼­¹ö±¸¼º"ÀÇ ¾²·¹µå ÆíÀ» ´Ù·ç¸é¼­ º¸°­Çϵµ·Ï ÇϰڽÀ´Ï´Ù.

ÀÌ ¹®¼­µéÀº ÀÎÅͳݻóÀÇ ¿Â¶óÀι®¼­µé°ú man ÆäÀÌÁöµéÀ» Âü°íÇØ¼­ ¸¸µé¾úÀ¾´Ï´Ù. ±×¸®°í Á¦ ½º½º·Î ¾²·¹µå¿¡ ´ëÇØ¼­ ±×¸® ±íÀº Áö½ÄÀ» °¡Áö°í ÀÖÁö ¾ÊÀ½À¸·Î, À߸øµÈ ³»¿ëÀÌ ÀÖÀ»¼ö ÀÖ½À´Ï´Ù. ÀÌ·¯ÇÑ ³»¿ëÀº °Ô½ÃÆÇ µî ¿¡´ñ±ÛÀ» ³²°ÜÁÖ½Ã¸é ¼öÁ¤Çϵµ·Ï ÇϰڽÀ´Ï´Ù.

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