ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
![]()
Tweet
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù. 1 È÷½ºÅ丮
2 °øÀ¯ ÀÚ¿ø¿¡ ´ëÇÑ Á¢±Ù Á¦¾î
´Ù¼öÀÇ °´Ã¼°¡ °øÀ¯ ÀÚ¿ø¿¡ Á¢±ÙÇÏ·Á°í Çϸé, (°øÀ¯ ÀÚ¿øÀÇ Á¾·ù¿¡ µû¶ó¼)Á¢±Ù ½ÃÁ¡À» µ¿±âÈ ½ÃÄÑÁÙ Çʿ䰡 »ý±ä´Ù. ¿©±â¿¡¼ µ¿±âȶõ ½Ã°£°ú °ø°£À» ¸ÂÃß¾î Áشٴ Àǹ̷Î, Áï °øÀ¯ ÀÚ¿ø ¿µ¿ª (°ø°£)¿¡ Á¢±ÙÇÏ´Â °´Ã¼µéÀÇ ÁøÀÔ ½Ã°£À» Á¦¾îÇÒ ¼ö ÀÖ¾î¾ß ÇÔÀ» ÀǹÌÇÑ´Ù.
¸ÖƼ Thread(¾²·¹µå) ÇÁ·Î±×·¥ ¿ª½Ã °øÀ¯ ÀÚ¿ø¿¡ ¿©·¯ °³ÀÇ ¾²·¹µå°¡ Á¢±ÙÇÒ ¼ö ÀÖÀ¸¹Ç·Î °øÀ¯ ÀÚ¿ø ¿µ¿ª¿¡ ´ëÇÑ µ¿±âȰ¡ ÇÊ¿ä ÇÏ´Ù.
Ä«¿îÆÃ ÇÁ·Î±×·¥À» ¿¹¸¦ µé¾î º¸ÀÚ. Ä«¿îÆ® º¯¼ö´Â Àü¿ª º¯¼ö·Î A,B µÎ°³ÀÇ ¾²·¹µå°¡ °øÀ¯Çϸé¼, 1¾¿ Áõ°¡ÇÏ´Â Ä«¿îÆÃ Á¤º¸¸¦ À¯ÁöÇϱâ À§ÇØ »ç¿ëµÈ´Ù. °øÀ¯ ÀÚ¿ø ¿µ¿ª Áï "count °ªÀ» ÀÐ¾î ¿À°í, ¿¬»êÀ» ÇØ¼ ÀúÀåÇÏ´Â" ¿µ¿ª¿¡ ´ëÇÑ ¾²·¹µå°£ µ¿±âȰ¡ ÀÌ·ç¾îÁöÁö ¾Ê´Â ´Ù¸é ¾Æ·¡¿Í °°Àº ÀÏÀÌ ¹ß»ýÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
ÀÌ·¯ÇÑ ¹®Á¦ÀÇ ÇØ°áÀ» À§Çؼ ¾²·¹µå¸¦ µ¿±âÈ ½ÃÄÑÁÙ Çʿ䰡 ÀÖ´Ù. 3 µ¿±âÈ ´Þ¼ºÀÇ ¹æ¹ý
ÀϹÝÀûÀ¸·Î µ¿±âÈ´Â "°ø°£°ú ½Ã°£"À» Á¦¾îÇÏ´Â ¹æ½ÄÀ¸·Î ÀÌ·ç¾îÁø´Ù. Áï "Á¢±Ù Á¦¾î°¡ ÇÊ¿äÇÑ °ø°£"À» ÁöÁ¤Çϰí ÁöÁ¤ÇÑ "°ø°£¿¡ ÁøÀÔ ÇÒ ¼ö ÀÖ´Â ½Ã°£"À» Á¦¾îÇÏ´Â ¹æ½ÄÀÌ´Ù.
¿©±â¿¡¼ "Á¢±Ù Á¦¾î°¡ ÇÊ¿äÇÑ °ø°£"¿¡´Â º¸È£ ÇØ¾ß ÇÒ °øÀ¯ ÀÚ¿øÀÌ ³õÀδÙ. º¸È£ ÇØ¾ßÇÒ °øÀ¯ ÀÚ¿øÀÌ ÀÖ´Â °ø°£À» ÀÓ°è ¿µ¿ªÀ̶ó°í ÇÑ´Ù. ½Ã°£ Á¦¾î´Â ÇØ´ç ÀÓ°è ¿µ¿ª¿¡ µ¿ ½Ã°£¿¡ ´ÜÁö ÇϳªÀÇ ¾²·¹µå¸¸ Á¢±ÙÇϵµ·Ï Á¦ÇÑ ÇÏ´Â ¹æ½ÄÀ¸·Î ÀÌ·ç¾îÁø´Ù.
ÀӰ迵¿ª¿¡ µé¾î°¡±â À§ÇÑ ÇϳªÀÇ Å°¸¦ °¡Áö°í °æÀïÇÏ´Â °ÍÀ¸·Î ÀÌÇØÇÏ¸é µÈ´Ù. ÀӰ迵¿ª¿¡ µé¾î°¡±â À§ÇÑ Å°´Â ´ÜÁö Çϳª ¹Û¿¡ ¾øÀ¸¹Ç·Î ¾î¶² ½º·¹µå°¡ ۸¦ ¾ò¾î¼ ÀӰ迵¿ª¿¡ ÁøÀÔÇϸé, ´Ù¸¥ ½º·¹µå´Â ۸¦ ¾òÀ» ¶§±îÁö - ¾Õ¼ ÀӰ迵¿ª¿¡ ÁøÀÔÇÑ ÇÁ·Î¼¼½º°¡ ۸¦ µÇµ¹·ÁÁÙ ¶§±îÁö - ±â´Ù·Á¾ß ÇÑ´Ù.
À§ÀÇ Ä«¿îÆÃ ÇÁ·Î±×·¥À» ¿¹·Î ¼³¸íÇØº¸ÀÚ. ÀÓ°è ¿µ¿ªÀº
ÀÌ ÀÓ°è ¿µ¿ª¿¡´Â ¿ÀÁ÷ ÇϳªÀÇ ¾²·¹µå¸¸ÀÌ ÁøÀÔÇÒ ¼ö ÀÖ´Ù. Áï ¾²·¹µå A°¡ ÀÓ°è ¿µ¿ª¿¡ ÁøÀÔÇØ¼ Äڵ带 ¼öÇàÁß¿¡ ÀÖ´Ù¸é ¾²·¹µå B´Â ÀÓ°è ¿µ¿ª ¹Û¿¡¼ ±â´Ù·Á¾ß ÇÑ´Ù. ÀÌ·¸°Ô ¾²·¹µå¸¦ µ¿±âÈ ½ÃÅ´À¸·Î½á, ¾Æ·¡¿Í °°ÀÌ Á¦´ë·ÎµÈ Ä«¿îÆÃ ¿¬»êÀ» º¸ÀåÇÒ ¼ö ÀÖ°Ô µÈ´Ù.
4 Mutex
¹ÂÅØ½º´Â pthread¿¡¼ Á¦°øÇÏ´Â µ¿±âÈ ¸ÅÄ¿´ÏÁòÀ¸·Î °øÀ¯ ÀÚ¿ø °ø°£¿¡ ´ëÇÑ Á¢±Ù ½Ã°£ Á¦¾î·Î µ¿±âȸ¦ ´Þ¼ºÇÑ´Ù. ±âº»ÀûÀÎ ¸ÅÄ¿´ÏÁòÀº ¼¼¸¶Æ÷¾î¿Í ºñ½ÁÇÏ´Ù. ƯÈ÷ POSIX ¼¼¸¶Æ÷¾î¿Í ºñ½ÁÇϸç, µ¿±âÈ ¸ÅÄ¿´ÏÁòÀ¸·Î ¹ÂÅØ½º ´ë½Å ¼¼¸¶Æ÷¾î¸¦ »ç¿ëÇÒ ¼öµµ ÀÖ´Ù. µ¿±âÈ ¸ÅÄ¿´ÏÁòÀÇ ÇÙ½ÉÀº »óÈ£ ¹èÁ¦·Î ´ÙÀ½°ú °°ÀÌ ´Þ¼º ÇÑ´Ù. global int v = 1;
lock()
{
while(1)
{
if (v==1)
break;
}
v = 0;
return 1;
}
unlock()
{
v = 1;
break;
}
¾îµð±îÁö³ª ¸ÅÄ¿´ÏÁò »óÀ¸·Î ±×·¸´Ù´Â ¾ê±â°í, ¼¼¸¶Æ÷¾î¿Í ¸¶Âù°¡Áö·Î busy wait »óÅ¿¡ ³õÀÌÁö ¾ÊÀ½À» º¸ÀåÇÑ´Ù.
»óÈ£ ¹èÁ¦´Â Àá±Ý Çü½ÄÀ¸·Î ÀÌ·ç¾îÁø´Ù. ¾²·¹µå´Â Àá±Ý v¸¦ ¾ò¾î¾ß ÀÓ°è ¿µ¿ª¿¡ ÁøÀÔÇÒ ¼ö ÀÖ´Ù. ÀÓ°è ¿µ¿ªÀ» ºüÁ®³ª¿À¸é Àá±ÝÀ» µÇµ¹·Á Á༠´Ù¸¥ ¾²·¹µå°¡ Àá±ÝÀ» ¾òÀ» ¼ö ÀÖµµ·Ï ÇÑ´Ù.
¹ÂÅØ½º ¸ÞÄ¿´ÏÁòÀÇ Æ¯Â¡À» Á¤¸®Çß´Ù.
5 ¹ÂÅØ½º ¸¸µé±â
¹ÂÅØ½º¸¦ »ý¼ºÇϱâ À§Çؼ ¿ì¸®´Â ¸ÕÀú, ¹ÂÅØ½ºÁ¤º¸¸¦ ÀúÀåÇϱâ À§ÇÑ Å¸ÀÔÀÎ pthread_mutex_t ¸¦ ¼±¾ðÇØÁÖ°í À̰ÍÀ» ÃʱâÈ ÇØÁÖ¾î¾ß ÇÑ´Ù. ¼±¾ð°ú ÃʱâÈÀÇ °¡Àå°£´ÜÇÑ ¹æ¹ýÀº PTHREAD_MUTEX_INITIALIZER »ó¼ö¸¦ ÇÒ´çÇÏ´Â °ÍÀ¸·Î ¾Æ·¡¿Í °°ÀÌ »ç¿ëÇÒ¼ö ÀÖ´Ù. pthread_mutex_t a_mutex = PTHREAD_MUTEX_INITIALIZER;
ȤÀº pthread_mutex_init(3)ÇÔ¼ö·Î ¹ÂÅØ½º¸¦ »ý¼ºÇÒ ¼öµµ ÀÖ´Ù. #include <pthread.h> int pthread_mutex_init(pthread_mutex_t * mutex, const pthread_mutex_attr *attr);
6 ¹ÂÅØ½º Àá±Ý, Àá±ÝÇØÁ¦, Á¦°Å
¹ÂÅØ½º Àá±ÝÀ» À§ÇÑ ÇÔ¼ö·Î´Â pthread_mutex_lock() ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù. ÀÌ ÇÔ¼ö´Â ÇØ´ç ¹ÂÅØ½º¿¡ ´ëÇØ¼ Àá±ÝÀ» ½ÃµµÇϴµ¥, ¸¸¾à Àá±×·Á´Â ¹ÂÅØ½º°¡ ´Ù¸¥ ¾²·¹µå¿¡ ÀÇÇØ¼ ÀÌ¹Ì Àá°ÜÀÖ´Ù¸é, Àá±ÝÀ» ¾òÀ»¼ö ÀÖÀ»¶§±îÁö - ÀÌ¹Ì Àá±Ù ´Ù¸¥ ¾²·¹µå°¡ ¹ÂÅØ½ºÀÇ Àá±ÝÀ» ÇØÁ¦ÇÒ¶§±îÁö - ºÀ¼â(ºí·°)µÇ°Ô µÈ´Ù. ´ÙÀ½Àº ÀÌ·¯ÇÑ ¹ÂÅØ½º Àá±ÝÀ» ¾ò±â À§ÇÑ Áö¿øÇÔ¼öµéÀÌ´Ù. int pthread_mutex_lock(pthread_mutex_t *mutex); int pthread_mutex_trylock(pthread_mutex_t *mutex); int pthread_mutex_destory(pthread_mutex_t *mutex);
pthread_mutex_trylock() ¸¦ »ç¿ëÇϸé Àá±ÝÀ» ¾òÀ»¼ö ¾øÀ»°æ¿ì ÇØ´ç Äڵ忡¼ ºí·°µÇÁö ¾Ê°í ¹Ù·Î ¿¡·¯Äڵ带 µ¹·ÁÁØ´Ù. Áï pthread_mutex_lock ÀÇ ºñºÀ¼â ¹öÁ¯À̶ó°í »ý°¢ÇÏ¸é µÈ´Ù.
¹ÂÅØ½º Àá±ÝÀ» ¾òÀºÈÄ ÇØ´ç ¿µ¿ª¿¡¼ÀÇ ÀÛ¾÷À» ¸¶Ä£ÈÄ Àá±ÝÀ» ÇØÁ¦Çϱâ À§Çؼ »ç¿ëÇÑ´Ù. »ç¿ëµÇ´Â ÇÔ¼ö´Â pthread_mutex_unlock(3) À̸ç ÇÔ¼ö¿øÇüÀº ´ÙÀ½°ú °°´Ù. int pthread_mutex_unlock(pthread_mutex_t *mutex);´ÙÀ½Àº ¾²·¹µå°£ °øÀ¯µÇ´Â ÀÚ¿øÀ» À§Çؼ Àá±ÝÀ» ¾î¶»°Ô »ç¿ëÇÏ´ÂÁö¸¦ º¸¿©ÁÖ´Â °£´ÜÇÑ ¿¹Á¦´Ù.
¿¹Á¦: mutex_lock.c #include <stdio.h> #include <unistd.h> #include <pthread.h> int ncount; // ¾²·¹µå°£ °øÀ¯µÇ´Â ÀÚ¿ø pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // ¾²·¹µå ÃʱâÈ void* do_loop(void *data) { int i; for (i = 0; i < 10; i++) { pthread_mutex_lock(&mutex); // Àá±ÝÀ» »ý¼ºÇÑ´Ù. printf("loop1 : %d\n", ncount); ncount ++; if(i == 10) return; pthread_mutex_unlock(&mutex); // Àá±ÝÀ» ÇØÁ¦ÇÑ´Ù. sleep(1); } } void* do_loop2(void *data) { int i; // Àá±ÝÀ» ¾òÀ¸·Á°í ÇÏÁö¸¸ do_loop ¿¡¼ ÀÌ¹Ì Àá±ÝÀ» // ¾ò¾úÀ½À¸·Î Àá±ÝÀÌ ÇØÁ¦µÉ¶§±îÁö ±â´Ù¸°´Ù. for (i = 0; i < 10; i++) { pthread_mutex_lock(&mutex); // Àá±ÝÀ» »ý¼ºÇÑ´Ù. printf("loop2 : %d\n", ncount); ncount ++; pthread_mutex_unlock(&mutex); // Àá±ÝÀ» ÇØÁ¦ÇÑ´Ù. sleep(2); } } int main() { int thr_id; pthread_t p_thread[2]; int status; int a = 1; ncount = 0; thr_id = pthread_create(&p_thread[0], NULL, do_loop, (void *)&a); sleep(1); thr_id = pthread_create(&p_thread[1], NULL, do_loop2, (void *)&a); pthread_join(p_thread[0], (void *) &status); pthread_join(p_thread[1], (void *) &status); status = pthread_mutex_destroy(&mutex); printf("code = %d", status); printf("programing is end"); return 0; }À§ÀÇ Äڵ带 ¿ì¼± mutex Àá±ÝÀ» ÇÏÁö ¾ÊÀºÃ¼ ÄÄÆÄÀÏÈÄ ½ÇÇàÇØº¸ÀÚ. °£´ÜÇÏ°Ô pthread_mutext_lock ¿Í pthread_mutex_unlock ºÎ¸¸ ÁÖ¼®Ã³¸®ÇÏ¸é µÈ´Ù. ±×·¯¸é do_loop2 ¿Í do_loop °¡ ÀÏÁ¤ÇÑ °£°ÝÀ» µÎ°í ncount ÀÚ¿ø¿¡ Á¢±ÙÇÏ´Â °ÍÀ» º¼¼ö ÀÖÀ»°ÍÀÌ´Ù. ±×·¯³ª ¿ì¸®´Â do_loop °¡ ncount ÀÚ¿øÀ» Á¢±ÙÇϰí Àִµ¿¾È ´Ù¸¥ ¾²·¹µå°¡ Á¢±ÙÇÏÁö ¾Ê±â¸¦ ¿øÇÒ¶§°¡ ÀÖÀ»°ÍÀÌ´Ù. ÀÌ·²¶§ ¹ÂÅØ½º Àá±ÝÀ» »ç¿ëÇÏ¸é µÈ´Ù.
À§ÀÇ Äڵ忡¼ ¹ÂÅØ½º Àá±Ý ºÎºÐÀÇ ÁÖ¼®À» Ç®°í ´Ù½Ã ÄÄÆÄÀÏÇØ¼ ½ÇÇà½ÃÄѺ¸¸é, do_loop ¾²·¹µå°¡ ncount Áõ°¡ ÀÛ¾÷À» ¸ðµÎ ¸¶Ä¥¶§±îÁö do_loop2 ¾²·¹µå´Â ÇØ´ç ¿µ¿ª¿¡¼ ºí·°µÊÀ» ¾Ë¼ö ÀÖÀ»°ÍÀÌ´Ù. ÀÌ·±½ÄÀ¸·Î ÇϳªÀÇ ¾²·¹µå°¡ ƯÁ¤ÀÚ¿ø¿¡ Á¢±ÙÇÒ¶§ ´Ù¸¥ ¾²·¹µå°¡ Á¢±ÙÇÏÁö ¸øÇϵµ·Ï(Çѹø¿¡ ÇϳªÀÇ ¾²·¹µå¸¸ ÇØ´ç ÀÚ¿ø¿¡ Á¢±ÙÇÒ¼ö ÀÖµµ·Ï) Á¦¾îÇÒ¼ö ÀÖ´Ù.
ÄÄÆÄÀÏ ¹æ¹ýÀº gcc -o mutex_lock mutex_lock.c -lpthread ÀÌ´Ù
´õÀÌ»ó ¹ÂÅØ½º¸¦ »ç¿ëÇÒÀÏÀÌ ¾ø´Ù¸é pthread_mutex_destory ¸¦ ÀÌ¿ëÇØ¼ ¹ÂÅØ½º ÀÚ¿øÀ» Á¦°Å(free) Çϵµ·Ï ÇÑ´Ù. ¸¸ÀÏ ¹ÂÅØ½ºÀÚ¿øÀ» »ç¿ëÇÏ´Â ¾²·¹µå°¡ Çϳª¶óµµ Á¸ÀçÇÑ´Ù¸é ¿¡·¯ÄÚµå(EBUSY)¸¦ ¸®ÅÏÇÑ´Ù. ±×·¯¹Ç·Î ¸ðµç ¾²·¹µåÀÇ ¹ÂÅØ½º¿¡ ´ëÇØ¼ pthread_mutex_unlock À» ÀÌ¿ëÇØ¼ Àá°ÜÁ®¾ß¸¸ ¹ÂÅØ½º Á¦°Å°¡ ¼º°øÇÒ¼ö ÀÖ´Ù. ¼º°øÇÒ°æ¿ì 0À» ³Ñ°ÜÁØ´Ù.
|
|
|
|
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|