ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
ÇöÀçÀ§Ä¡ : docbook>thread_cancellation
![]()
Tweet
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
HTML º¯È¯¹®¼
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V4.1//EN">
<article lang="ko">
<!-- -->
<!-- ¹®¼ Á¤º¸ -->
<!-- -->
<articleinfo>
<title>Thread Ãë¼Ò¿Í Á¾·á</title>
<author>
<surname>À± »ó¹è</surname>
<affiliation>
<address>
<email>yundream@joinc.co.kr</email>
</address>
</affiliation>
</author>
<revhistory>
<revision>
<revnumber>1.1</revnumber>
<date>2004³â 2¿ù 20ÀÏ 21½Ã</date>
<revremark>Ãë¼Ò»óÅ¿¡ ´ëÇÑ ¼³¸í¿À·ù ¼öÁ¤</revremark>
</revision>
<revision>
<revnumber>1.0</revnumber>
<date>2004³â 2¿ù 17ÀÏ 21½Ã</date>
<revremark>Ãë¼ÒÁ¾·ù¿¡ ´ëÇÑ ³»¿ë Ãß°¡</revremark>
</revision>
<revision>
<revnumber>0.9</revnumber>
<date>2004³â 2¿ù 17ÀÏ 20½Ã</date>
<revremark>Ãë¼Ò»óÅ¿¡ ´ëÇÑ À߸øµÈ ºÎºÐ ¼öÁ¤</revremark>
</revision>
<revision>
<revnumber>0.8</revnumber>
<date>2004³â 2¿ù 13ÀÏ 19½Ã</date>
<revremark>ÃÖÃÊ ¹®¼ÀÛ¼º</revremark>
</revision>
</revhistory>
</articleinfo>
<!-- -->
<!-- ¼½¼Ç ½ÃÀÛ -->
<!-- -->
<section>
<title>¼Ò°³</title>
<para>
¾²·¹µå¿¡ ´ëÇØ¼ ÇнÀÀ» ÇØº»ÀûÀÌ ÀÖ´Ù¸é Thread Ãë¼Ò¿Í Á¾·á¿¡ ´ëÇÑ
³»¿ëÀº »·ÇÑ °Í ¾Æ´Ï³Ä ¶ó°í »ý°¢ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÇÏÁö¸¸ ÀÌ ¹®¼¸¦
ÀÐ¾î º¸¸é ¿Ö º°µµÀÇ ¹®¼¸¦ ¸¸µé¾î¼ Á¾·á¿Í Ãë¼Ò¿¡ ´ëÇØ¼ ´Ù·ç¾ú´ÂÁö
ÀÌÇØÇÏ°Ô µÉ °ÍÀÌ´Ù.
</para>
</section>
<section>
<title>Thread Ãë¼Ò(cancellation)¿Í Á¾·á</title>
<para>
¾²·¹µå´Â Á¦¾î°¡´ÉÇÑ °´Ã¼·Î Çʿ信 µû¶ó »ý¼º½Ãų ¼ö ÀÖµíÀÌ Çʿ信
µû¶ó¼ Áß´Ü ½Ãų ¼öµµ ÀÖ´Ù. ÀÌ ¾²·¹µå Áß´ÜÀ̶ó´Â °ÍÀÌ ¸Å¿ì ´Ü¼øÇÑ
ÇàÀ§¶ó°í »ý°¢µÇÁö¸¸ »ý°¢Ã³·³ ±×·¸°Ô ´Ü¼øÇÑ ÇàÀ§°¡ ¾Æ´Ï´Ù. ¸ÖƼ
¾²·¹µå ÇÁ·Î±×·¥À̶ó¸é ¾²·¹µå°£ µ¿±âȸ¦ À§Çؼ Á¶°Çº¯¼ö ¹ÂÅØ½ºµî
À» »ç¿ëÇϰí ÀÖÀ» °ÍÀ̸ç, ¿©·¯°¡Áö °øÀ¯ ÀÚ¿øµé ¿ª½Ã °¡Áö°í ÀÖÀ»
°ÍÀÌ´Ù.
</para>
<para>
¸î¸íÀÇ ÀοøÀÌ °°ÀÌ Âü°¡Çؼ ÁøÇàÇÏ´Â ÇÁ·ÎÁ§Æ®°¡ ÀÖ´Ù°í »ý°¢ÇØ º¸ÀÚ.
±×Áß ÇѸíÀÌ ÇÁ·ÎÁ§Æ®¿¡¼ ºüÁö¸é ³ª¸ÓÁö ÀοøÀÌ ÇÁ·ÎÁ§Æ®¸¦ ÁøÇàÇϴµ¥
¹®Á¦°¡ »ý±âÁö ¾Êµµ·Ï ÀÌ·± Àú·± µÞ¼ö½ÀÀ» ÇØÁÖ´Â°Ô ¸Å¿ì Áß¿äÇÏ´Ù.
¾²·¹µå ¿ª½Ã ¸¶Âù°¡Áö·Î Áß´Ü(Á¾·á)½Ã µÞ¼ö½ÀÀ» ÇØÁÖ´Â °ÍÀº ¸Å¿ì Áß¿äÇÑ
ÀÏÀÌ´Ù. ÀÌ ¹®¼´Â ¾²·¹µå Ãë¼Ò¿¡ °ü·ÃµÈ ³»¿ë°ú ¾²·¹µå Á¾·á½Ã
½Å°æ½á¾ßµÉ (ÀÚ¿øÁ¤¸® ¿Í °°Àº)°Íµé¿¡ ´ëÇØ¼ ¾Ë¾Æº¸µµ·Ï ÇÑ´Ù.
</para>
<section>
<title>Thread Ãë¼Ò</title>
<para>
¸ÖƼ ¾²·¹µå ÇÁ·Î±×·¥¿¡¼ ƯÁ¤ ¾²·¹µå¸¦ Áß´Ü ½Ã۰íÀÚ ÇÒ¶§¸¦ À§Çؼ
Pthread´Â ptread_cancel()À̶ó´Â ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù.
<screen>
int pthread_cancel(pthread_t thread);
</screen>
ÀÌ ÇÔ¼ö´Â ÀÎÀÚ·Î ÁÖ¾îÁø ¾²·¹µå ½Äº°¹øÈ£
<emphasis>thread</emphasis>¸¦ °¡Áö´Â ¾²·¹µå¸¦ ÁßÁö½ÃŲ´Ù.
¸íÈ®È÷ ¸»ÇÏÀÚ¸é ¾²·¹µå¸¦ ÁßÁö ½ÃŰ´Â°Ô ¾Æ´Ï°í ¾²·¹µå¿¡ Ãë¼Ò ¿äûÀ»
ÇÏ´Â °ÍÀ¸·Î ºÁ¾ß ÇÑ´Ù. Ãë¼Ò ¿äûÀ» ¹ÞÀº ¾²·¹µå°¡ ¾î¶»°Ô ¹ÝÀÀ ÇÒ·±Áö´Â
¿äûÀ» ¹ÞÀº ¾²·¹µåÀÇ Ãë¼Ò »óÅ ¼³Á¤¿¡ ÀÇÁ¸ÇÑ´Ù. Ãë¼Ò ¿äûÀ»
¹ÞÀº ¾²·¹µå´Â Ãë¼Ò »óÅ¿¡ ÀÇÇØ¼ ÇÊ¿äÇÑ ÀÛ¾÷À» ÇÑ ÈÄ Á¾·á ÇÏ°Ô µÈ´Ù.
Ãë¼Ò ¿äûÀ» ¹Þ¾Æ¼ Á¾·áÇÏ´Â ¾²·¹µå´Â pthread_exit(PTHREAD_CANCELED)¸¦
È£ÃâÇϰí Á¾·áÇÑ´Ù.
</para>
<para>
pthread_cancel()¿¡ ÀÇÇØ¼ Ãë¼Ò°¡ Å뺸µÈ
¾²·¹µå´Â ¾²·¹µå Ãë¼Ò »óÅÂÀÇ ¼³Á¤¿¡ µû¶ó¼
<emphasis>Ãë¼Ò ¿äûÀ» ¹«½Ã</emphasis>ÇÒ ¼öµµ
<emphasis>Ãë¼ÒÁöÁ¡(cancellation point)</emphasis>
ÁöÁ¡±îÁö ¼öÇàÇѵڿ¡ Á¾·á µÉ¼öµµ Àֱ⠶§¹®ÀÌ´Ù.
</para>
<para>
¾²·¹µå Ãë¼Ò¿Í Á¾·á´Â ¾ö¿¬È÷ ´Ù¸£´Ù´Â °ÍÀ» ÀÌÇØÇϱ⠹ٶõ´Ù.
±×·¸Áö ¾ÊÀ¸¸é ¾ÕÀ¸·Î ¹®¼ÀÇ ³»¿ëÀ» Àдµ¥ Çê°¥¸± ¼ö ÀÖ´Ù.
</para>
<section>
<title>¾²·¹µå Ãë¼Ò»óÅÂÀÇ ¼³Á¤</title>
<para>
¾²·¹µå°¡ pthread_cancel()¿¡ ÀÇÇØ¼ Ãë¼Ò¿äûÀ» ¹Þ¾ÒÀ» ¶§
¾î¶»°Ô ¹ÝÀÀÇÒ·±Áö¸¦ °áÁ¤ÇÏ´Â ¾²·¹µå Ãë¼Ò»óÅ´ ¿©·¯°¡Áö
¹æ¹ý¿¡ ÀÇÇØ¼ °áÁ¤µÈ´Ù. Ãë¼Ò »óÅ´ pthread_setcancelstat()
ÇÔ¼ö¿¡ ÀÇÇØ °áÁ¤ÇÑ´Ù.
<screen>
int pthread_setcancelstate(int state, int *oldstate);
</screen>
ù¹øÂ° ÀÎÀÚÀÎ <emphasis>state</emphasis>´Â »õ·Î¿î Ãë¼Ò»óŸ¦
¼³Á¤Çϱâ À§Çؼ »ç¿ëµÈ´Ù. µÎ¹øÂ° ÀÎÀÚÀÎ
<emphasis>oldstate</emphasis>´Â ÀÌÀüÀÇ Ãë¼Ò»óÅÂÀÇ ¼³Á¤°ªÀ»
¹Þ¾Æ¿À±â À§Çؼ »ç¿ëµÈ´Ù. ÀÌ ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
<screen>
int old_cancel_state;
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &old_cancel_state);
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &old_cancel_state);
</screen>
¸¸¾à ÀÌÀüÀÇ Ãë¼Ò»óÅ ¼³Á¤°ªÀÌ ÇÊ¿ä ¾ø´Ù¸é old_cancel_state´ë½Å
NULLÀ» »ç¿ëÇÏ¸é µÈ´Ù. À§ÀÇ »ç¿ë¿¡¼ ó·³ ¾²·¹µå´Â
PTHREAD_CANCEL_DISABLE¿Í PTHREAD_CANCEL_ENABLE µÑÁß ÇϳªÀÇ
Ãë¼Ò»óŸ¦ °¡Áú ¼ö ÀÖ´Ù.
</para>
<para>
¸¸¾à PTHREAD_CANCEL_ENABLE »óŶó¸é ¾²·¹µå´Â Ãë¼Ò¿äûÀ»
¹Þ¾ÆµéÀ̰í Ãë¼ÒÁöÁ¡±îÁö ÁøÇàÇÑ´ÙÀ½ Ãë¼Ò ÁöÁ¡À» ¹þ¾î³ª¾ßÁö
Á¾·áÇÑ´Ù. ENABLE »óÅÂÀÏ °æ¿ì º°µµ·Î Ãë¼ÒÁöÁ¡±îÁö ÁøÇàÇÑ´ÙÀ½
Á¾·áÇÒ °ÍÀÎÁö ¾Æ´Ï¸é ¹Ù·Î Á¾·áÇÒ °ÍÀÎÁö¸¦ pthread_setcanceltype()
¸¦ ÅëÇØ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.
¸¸¾à PTHREAD_CANCEL_DISABLE »óŶó¸é Ãë¼Ò¿äûÀ»
¹ÞÀº ÈÄ Ãë¼ÒÁöÁ¡±îÁöÀÇ ÁøÇàÀ» ÇÏÁö ¾Ê°í ¹Ù·Î Á¾·áÇÑ´Ù.
</para>
</section>
<section>
<title>¾²·¹µå Ãë¼ÒÁ¾·ùÀÇ ¼³Á¤</title>
<para>
¾²·¹µå Ãë¼Ò»óŰ¡ PTHREAD_CANCEL_ENABLEÀÎ °æ¿ì Ãë¼ÒÀÇ Á¾·ù¸¦ °áÁ¤ÇÒ
¼ö ÀÖ´Ù. Ãë¼ÒÁ¾·ùÀÇ °áÁ¤Àº pthread_setcanceltype()À» ÅëÇØ¼ ÀÌ·ç¾îÁø´Ù.
<screen>
int pthread_setcanceltype(int type, int *oldtype);
</screen>
Ãë¼ÒÁ¾·ù´Â <emphasis>type</emphasis>¸¦ ÅëÇØ¼ °áÁ¤µÈ´Ù.
<emphasis>PTHREAD_CANCEL_ASYNCHRONOUS</emphasis>¿Í
<emphasis>PTHREAD_CANCEL_DEFERRED</emphasis> µÑ Áß Çϳª¸¦ ¼±ÅÃÇÒ ¼ö
ÀÖ´Ù. ÀüÀÚÀÏ °æ¿ì ¹Ù·Î Á¾·áÇϸç, ÈÄÀÚÀÇ °æ¿ì Ãë¼ÒÁöÁ¡À» ¹þ¾î³¯ ¶§±îÁö
±â´Ù¸®°Ô µÈ´Ù. <emphasis>oldtype</emphasis>¸¦ ÀÌ¿ëÇØ¼ ÀÌÀü Ãë¼ÒŸÀÔÀ»
¾ò¾î ¿Ã ¼ö ÀÖ´Ù. NULLÀ̶ó¸é ¹Þ¾Æ¿ÀÁö ¾Ê´Â´Ù.
ÀÌ ÇÔ¼ö´Â ´ç¿¬ÇÏÁö¸¸ Ãë¼Ò»óŰ¡ PTHREAD_CANCEL_DISABLE ¶ó¸é ÀÇ¹Ì ¾ø´Â
ÇÔ¼ö´Ù.
</para>
</section>
<section>
<title>Ãë¼ÒÁöÁ¡</title>
<para>
¾²·¹µå¿¡°Ô Ãë¼Ò¿äûÀÌ ¿Ô´Ù°í ÇØ¼ ¹«Á¶°Ç Ãë¼ÒÇØ ¹ö¸®¸é
¹®Á¦°¡ »ý±æ ¼öµµ ÀÖ´Ù. ¾î¶² ÀÏÀ» ó¸®Çϰí ÀÖ´Â Áß¿¡
Ãë¼Ò¿äûÀÌ Àü´ÞÇߴµ¥, º°·Î Áß¿äÇÏÁö ¾Ê´Â (¹«½ÃÇØµµ µÉ¸¸ÇÑ)
ÀÏÀ̶ó¸é Áß´ÜÈÄ ¹Ù·Î Ãë¼ÒÇØµµ µÇ°ÚÁö¸¸ Áß¿äÇÑ ÀÏÀ» ó¸®ÇÏ´Â
ÁßÀ̶ó¸é ÀÏÀ» ó¸®ÇÑÈÄ Á¾·á ÇØ¾ß ÇÒ°ÍÀÌ´Ù. ÀÌ ¸¶Áö ³ë¼±ÀÌ
Ãë¼ÒÁöÁ¡ÀÌ´Ù.
</para>
<para>
Ãë¼ÒÁöÁ¡À¸·Î ¼³Á¤µÉ ¼ö ÀÖ´Â ¿µ¿ªÀº ´ÙÀ½°ú °°´Ù.
<screen>
pthread_join(3)
pthread_cond_wait(3)
pthread_cond_timedwait(3)
pthread_testcancel(3)
sem_wait(3)
sigwait(3)
</screen>
pthread_setcancelstate()ÇÔ¼ö¿¡ ÀÇÇØ¼ PTHREAD_CANCEL_ENABLE
»óÅ·ΠµÇ¾î ÀÖ´Ù¸é Ãë¼ÒÁöÁ¡À» ¹«½ÃÇϰí Áï½Ã Á¾·á µÈ´Ù.
PTHREAD_CANCEL_DISABLE·Î µÇ¾î ÀÖ´Ù¸é À§ÀÇ Ãë¼ÒÁöÁ¡À»
¹þ¾î³¯ ¶§±îÁö ±â´Ù¸°´Ù. Áï Ãë¼Ò¿äûÀ» ¹ÞÀº ¾²·¹µå°¡
pthread_cond_wait()¿¡¼ Á¶°Çº¯¼ö¸¦ ±â´Ù¸®´Â°í ÀÖ´Ù¸é Á¶°Çº¯¼ö
¸¦ ¹ÞÀ» ¶§±îÁö Ãë¼Ò¸¦ À¯º¸ÇÏ°Ô µÈ´Ù.
</para>
</section>
</section>
<section>
<title>¾²·¹µå ±âº» Ãë¼Ò»óÅÂ¿Í Ãë¼Ò Á¾·ù</title>
<para>
º°´Ù¸¥ ¼³Á¤ÀÌ ¾øÀ» °æ¿ì pthread_create()·Î ¸¸µé¾î Áö´Â ¾²·¹µå´Â
PTHREAD_CANCEL_ENABLE, PTHREAD_CANCEL_DEFERRED·Î »óÅ·Π»ý¼ºµÈ´Ù.
</para>
</section>
<section>
<title>¾²·¹µå Á¾·á½Ã ÀÚ¿øÁ¤¸®</title>
<para>
pthread_cancel()µîÀ» ÅëÇØ¼ Á¾·á Å뺸¸¦ ¹ÞÀº ¾²·¹µå´Â
Á¾·áÇϱâ Àü¿¡ ¿©·¯°¡Áö ÀÏÀ» ÇØÁÖ¾î¾ß ÇÒ °ÍÀÌ´Ù.
¹¹ °£´ÜÇÑ ¾²·¹µå¶ó¸é °ü°è ¾ø°ÚÁö¸¸ º¹ÀâÇÏ°Ô ¾ôÇô ÀÖ´Â
¸ÖƼ ¾²·¹µå ÇÁ·Î±×·¥À̶ó¸é ÀÌ·± Àú·± Á¤¸®ÇØÁà¾ß ÇÒ °ÍµéÀÌ
¸¹À» °ÍÀÌ´Ù.
</para>
<section>
<title>¾²·¹µå Á¾·á½Ã ÀÚ¿øÇØÁ¦</title>
<para>
¾²·¹µå¿¡¼ malloc()µîÀ» È£ÃâÇØ¼ ¸Þ¸ð¸® °ø°£À» È®º¸Çߴٰųª
DB³ª ÆÄÀÏ, ¼ÒÄϵîÀ» ¿¾î¼ ÀÛ¾÷Çß´Ù¸é ¹Ýµå½Ã À̵é ÀÚ¿øÀ»
ÇØÁ¦½ÃÄÑÁà¾ß ÇÑ´Ù. °£´ÜÇÏ°Ô »ý°¢ÇÏÀÚ¸é ¾²·¹µå Á¾·á½ÃÁ¡¿¡¼
free(), close(), DB¶ó¸é ÀÌ·± Àú·± Á¤¸®¸¦ ÇØÁÖ¸é µÉ°ÍÀÌ´Ù.
±×·¯³ª pthrad_cancel()µî¿¡ ÀÇÇØ¼ ÀÛ¾÷Áß°£¿¡ ¿äûÀ»
¹Þ¾Ò´Ù¸é ±×¸® °£´ÜÇÑ ¹®Á¦°¡ ¾Æ´Ï´Ù. ¾²·¹µå ¸¶Áö¸·±îÁö
·çƾÀ» ÁøÇàÇÒ ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. ÀÌ·² °æ¿ì¸¦ ´ëºñÇØ¼
pthread_cleanup_push(), pthread_cleanup_pop()¿Í °°Àº
ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù.
</para>
<para>
ÀÌ ÇÔ¼öµéÀ» ÀÌ¿ëÇØ¼ ¾²·¹µå°¡ Á¾·áÇÒ ¶§ È£ÃâÇØ¾ßÇÒ ÇÔ¼ö¸¦
ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ±×·¯¹Ç·Î ÇÁ·Î±×·¡¸Ó´Â À̵é ÇÔ¼ö¿¡ ÀÚ¿øÇØÁ¦¿Í
°°Àº ÇÊ¿äÇÑ Äڵ带 ³Ö¾îµÎ±â¸¸ ÇÏ¸é µÈ´Ù.
À̵é ÇÔ¼ö¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº
<ulink url="http://www.joinc.co.kr/modules/moniwiki/wiki.php/pthread_API?action=highlight&value=kernel#CLEANUP">Pthread_API</ulink>¸¦
Âü°íÇϱ⠹ٶõ´Ù.
</para>
</section>
</section>
<section>
<title>ÃÑÁ¤¸®</title>
<para>
Áö±Ý±îÁöÀÇ ³»¿ëÀ» ¿¹Á¦¸¦ ÅëÇØ¼ Á¤¸®Çغ¸µµ·Ï ÇÏÀÚ.
<screen>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/time.h>
// ¾²·¹µå Á¾·á½Ã È£ÃâµÉ ÇÔ¼ö
void clean_up(void *);
// ¾²·¹µå ÇÔ¼ö
void *thread_func(void *);
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t lmu = PTHREAD_MUTEX_INITIALIZER;
int main(int argc, char **argv)
{
pthread_t pt;
pthread_create(&pt, NULL, thread_func, NULL);
// »ý¼ºµÈ ¾²·¹µå pt¿¡ Ãë¼Ò ¿äûÀ» º¸³½´Ù.
pthread_cancel(pt);
// 5Ãʸ¦ ½® ÈÄ¿¡ ½Ã±×³ÎÀ» º¸³½´Ù.
sleep(5);
pthread_cond_signal(&cond);
// joinÈÄ Á¾·áÇÑ´Ù.
pthread_join(pt, NULL);
printf("exit\n");
exit(1);
}
// ¾²·¹µå Á¾·á½Ã È¿ÃâµÉ ÇÔ¼ö
// ¿©±â¿¡ ÀÚ¿øÇØÁ¦·çƾÀ» ÀÔ·ÂÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
void clean_up(void *arg)
{
printf("Thread cancel Clean_up function\n");
}
void *thread_func(void *arg)
{
// DISABLE »óÅ´Ù.
// À̰æ¿ì ¾²·¹µå¿¡ ´ëÇØ¼ Ãë¼Ò ¿äûÀÌ µé¾î¿À¸é
// ¹Ù·Î Ãë¼ÒµÈ´Ù.
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
// ¾²·¹µå Á¾·á½Ã È£ÃâµÉ ÇÔ¼ö µî·Ï
pthread_cleanup_push(clean_up, (void *)NULL);
while(1)
{
pthread_mutex_lock(&lmu);
printf("THREAD cond wait\n");
pthread_cond_wait(&cond, &lmu);
printf("NO WAIT COND\n");
pthread_mutex_unlock(&lmu);
}
printf("EXIT\n");
pthread_cleanup_pop(0);
}
</screen>
main ¾²·¹µå´Â thread_func¸¦ ½ÇÇà½ÃŲ´Ù. thread_func´Â
pthread_cond_wait()¿¡¼ ½ÅÈ£°¡ ¹ß»ýÇϱ⸦ ±â´Ù¸®°Ô µÈ´Ù.
Àá½ÃÈÄ main ¾²·¹µå´Â pthread_cancel()À» ÀÌ¿ëÇØ¼ thread_func
¾²·¹µå¿¡ Ãë¼Ò ¿äûÀ» ÇÏ°Ô µÈ´Ù. À§ÀÇ °æ¿ì thread_func¾²·¹µå´Â
Ãë¼Ò»óŰ¡ PTHREAD_CANCEL_DISABLE·Î µÇ¾î Àֱ⠶§¹®¿¡ Ãë¼Ò ÁöÁ¡µîÀº
ºÎ½ÃÇÏ°í ¹Ù·Î Á¾·áµÈ´Ù. À̶§ pthread_cleanup_push()¿¡ µî·ÏµÈ
clean_upÇÔ¼ö°¡ ½ÇÇàµÇ´Â°É È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
</para>
<para>
PTHREAD_CANCEL_ENABLE·Î µÇ¾î ÀÖÀ» °æ¿ì Ãë¼Ò ¿äûÀ» ¹Þ¾ÆµéÀ̱â
¶§¹®¿¡ Ãë¼Ò ¿äûÀÌ µé¾î¿À´õ ¶óµµ thread_func°¡ ÇöÀç Á¾·á
ÁöÁ¡¿¡ ¸Ó¹°·¯ Àֱ⠶§¹®¿¡ °ð¹Ù·Î Á¾·áÇÏÁö ¾Ê´Â´Ù.
main ¾²·¹µå¿¡¼ pthread_cond_signal()¸¦
È£ÃâÇØ¼ thread_func°¡ cond_wait»óŸ¦ ¹þ¾î³ ÈÄ Á¾·áµÈ´Ù.
¹°·Ð cleanup ÇÔ¼öµµ ½ÇÇàµÈ´Ù.
</para>
</section>
</section>
<section>
<title>Âü°í¹®Çå</title>
<para>
<orderedlist>
<listitem>
<para>
<ulink url="http://www.joinc.co.kr/modules/moniwiki/wiki.php/pthread_API">pthread API ·¹ÆÛ·±½º</ulink>
</para>
</listitem>
<listitem>
<para>
<ulink url="http://www.joinc.co.kr/modules/moniwiki/wiki.php/article_pthread_mutex_Á¶°Çº¯¼ö">mutex¿Í Á¶°Çº¯¼ö</ulink>
</para>
</listitem>
</orderedlist>
</para>
</section>
</article>
|
|
|
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|