Á¶°Çº¯¼ö¸¦ ÀÌ¿ëÇÑ Thread Pool
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



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

Thread Pool

¸ÖƼ ¾²·¹µå ÇÁ·Î±×·¥ÀÇ ¼º´ÉÀ» ³ôÀ̱â À§Çؼ­ ¹Ì¸® ¾²·¹µå¸¦ ÁغñÇØ¼­, ¾²·¹µå¸¦ ÇÒ´çÇÏ´Â, ¾²·¹µå Ç® ¹æ½ÄÀÌ ³Î¸® »ç¿ëµË´Ï´Ù. ºñ±³Àû ±¸ÇöÀÌ °£´ÜÇϰí, ´Ù¾çÇÑ ÀÀ¿ëÀÌ °¡´ÉÇϱ⠶§¹®ÀÔ´Ï´Ù.

¿¹Àü¿¡ ¸®¾ó ŸÀÓ ½Ã±×³ÎÀ» ÀÌ¿ëÇÑ Thread Pool±¸ÇöÀ» ´Ù·ç¾ú´Âµ¥, À̹ø¿¡´Â Á¶°Çº¯¼ö¸¦ ÀÌ¿ëÇÑ ±¸ÇöÀ» ¾Ë¾Æº¸µµ·Ï ÇϰڽÀ´Ï´Ù. ¾²·¹µå Ç®°ú Á¶°Çº¯¼ö¿¡ ´ëÇÑ ÀϹÝÀûÀÎ ¼³¸íÀº ¸µÅ©µéÀ» Âü°íÇϽñ⠹ٶø´Ï´Ù.

¾ÆÀ̵ð¾î

Àú´Â Áö±Ý ´ÙÁß Á¢¼Ó ³×Æ®¿öÅ© ÇÁ·Î±×·¥À» ¸¸µé·Á°í Çϰí ÀÖ½À´Ï´Ù. ÀÌ ³×Æ®¿öÅ© ÇÁ·Î±×·¥Àº À¥ ¼­¹öó·³ ¿¬°á°ú Á¾·á°¡ ºó¹øÇÑ ÇÁ·Î±×·¥ÀÔ´Ï´Ù. óÀ½¿£ Ŭ¶óÀÌ¾ðÆ® ¿¬°á ´ç ÇϳªÀÇ ¾²·¹µå¸¦ »ý¼ºÇÏ´Â ¹æ½ÄÀ» »ç¿ëÇß½À´Ï´Ù. ±×·±µ¥, ÃÊ´ç ¿¬°á Ŭ¶óÀ̾ðÆ®ÀÇ ¼ö°¡ ´Ã¾î³ªÀÚ ¼º´ÉÀÌ ´«¿¡ ¶ç°Ô ¶³¾îÁö±â ½ÃÀÛÇß½À´Ï´Ù.

¾Æ¹«·¡µµ ¾²·¹µå »ý¼º¿¡ ³Ê¹« ¸¹Àº ºñ¿ëÀÌ ¼Ò¸ðµÇ´Â °Í °°±º¿ä. ±×·¡¼­ ½º·¹µå Ç® ¹æ½ÄÀ¸·Î ¹Ù²Ù±â·Î Çß½À´Ï´Ù.

ÁöÁ¤µÈ ¼ö ¸¸Å­ ¹Ì¸® ÀÚ½Ä ¾²·¹µå¸¦ ¸¸µé¾î ³õ°í, Ŭ¶óÀÌ¾ðÆ® ¿¬°áÀÌ µé¾î¿À¸é ³ë´Â ÀÚ½Ä ¾²·¹µå¸¦ ±ú¿ö¼­ ÀÛ¾÷À» ÇÒ´çÇÏ´Â ¹æ½ÄÀÔ´Ï´Ù. ¾²·¹µå »ý¼ºÀ» ÇÒ Çʿ䰡 ¾øÀ¸´Ï, ¼º´É Çâ»óÀ» ²ÒÇÒ ¼ö ÀÖ°ÚÁÒ.!?


»¡°£»ö ¾²·¹µå´Â ÀÛ¾÷ÁßÀÎ ¾²·¹µåÀ̰í, ³ë¶õ»ö ¾²·¹µå´Â ³ë´Â ¾²·¹µå ÀÔ´Ï´Ù. accept() ÇÔ¼ö·Î Ŭ¶óÀÌ¾ðÆ® ¿¬°áÀ» °¡Á®¿À¸é, ³ë´Â ¾²·¹µå Áß Çϳª¸¦ ±ú¿ó´Ï´Ù. ±ú¿ï ¶§, Ŭ¶óÀÌ¾ðÆ® ¿¬°á ¼ÒÄϰú ÀÛ¾÷¿¡ ÇÊ¿äÇÑ Á¤º¸¸¦ ÇÔ²² ³Ñ°Ü¾ß ÇϰÚÁÒ!

±¸Çö

ÀÌÁ¦ ±¸ÇöÀ» ÇØº¼ Â÷·Ê ±º¿ä. Àú´Â C++À» ÀÌ¿ëÇØ¼­ ±¸ÇöÇÒ °èȹÀÔ´Ï´Ù. ºÎ¸ð ¾²·¹µå¿Í ÀÚ½Ä ¾²·¹µå°£ ¸Þ¼­µå¿Í ¼Ó¼ºÀ» ±³È¯Çϸé Á» ´õ ½±°Ô ÀÛ¾÷ Á¦¾î°¡ µÉ °Í °°¾Æ¼­ ¸»ÀÔ´Ï´Ù.

Á¶°Çº¯¼ö·Î ±â´Ù¸®±â

¾²·¹µå Ç® ±¸Çö¿¡¼­ °¡Àå Áß¿äÇÑ ¿ä¼Ò Áß Çϳª´Â "ÀÛ¾÷ Áö½Ã°¡ ÀÖÀ» ¶§±îÁö ºÀ¼âµÇµµ·Ï"±¸ÇöÇÏ´Â °ÍÀÔ´Ï´Ù. ¿©±â¿¡¼­´Â Á¶°Çº¯¼ö¸¦ ÀÌ¿ëÇϱâ·Î Çß½À´Ï´Ù. ÀÚ½Ä ¾²·¹µå´Â pthread_cond_waitÇÔ¼ö·Î ºÎ¸ð ¾²·¹µå°¡ ±ú¿ï ¶§±îÁö ±â´Ù¸³´Ï´Ù. ºÎ¸ð ¾²·¹µå°¡ ±ú¿ì´Â ½ÃÁ¡Àº acceptÇÔ¼ö°¡ ¹ÝȯÇÏ´Â ½ÃÁ¡À¸·Î, pthread_cond_signalÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ÀÚ½Ä ½º·¹µå¸¦ ±ú¿ó´Ï´Ù.

pthread_cond_wait ÇÔ¼ö´Â ½Ã±×³ÎÀÌ ÀÖÀ» ¶§±îÁö, ºÀ¼âµÇ¹Ç·Î "ÀÛ¾÷Áö½Ã°¡ ÀÖÀ» ¶§±îÁö ºÀ¼âµ¹ °Í"À̶ó´Â Á¶°ÇÀº ÀÏ´Ü ¸¸Á·À» ½ÃÄ×½À´Ï´Ù.

¶Ç Çϳª ¸¸Á·½ÃÄÑ¾ß ÇÒ Á¶°ÇÀ¸·Î "ºÀ¼â°¡ Ç®·Á¼­ ÀÛ¾÷ÁßÀÏ ¶§´Â ÀÌ ÀÚ½Ä ¾²·¹µå¸¦ È£ÃâÇÏÁö ¾Êµµ·Ï ÇÒ °Í"ÀÔ´Ï´Ù. À̰͵µ °£´ÜÇÏ°Ô ÇØ°áÇÒ ¼ö ÀÖ½À´Ï´Ù. Á¶°Çº¯¼ö´Â ¹ÂÅØ½º¿Í ÇÔ²² »ç¿ëµÇ±â ¶§¹®ÀÌÁÒ. pthread_cond_wait ÇÔ¼ö´Â ¸Å°³º¯¼ö·Î Á¶°Çº¯¼ö¿Í ÇÔ²² ¹ÂÅØ½º¸¦ »ç¿ëÇÕ´Ï´Ù. _cond_waitÇÔ¼ö¸¦ È£ÃâÇÏ¸é ¸Å°³º¯¼ö·Î ÁÖ¾îÁø ¹ÂÅØ½ºÀÇ Àá±ÝÀ» ÀÚµ¿À¸·Î µ¹·ÁÁÝ´Ï´Ù. ±×·¯´Ù°¡ ½Ã±×³ÎÀ» ¹Þ°í ¹ÝȯÇϸé, ¹ÂÅØ½º Àá±ÝÀ» ¾ò°Ô µË´Ï´Ù. Áï ÀÛ¾÷¿µ¿ªÀ» ÀӰ迵¿ªÀ¸·Î ÇÏ´Â °ÅÁÒ.

±×·¯¹Ç·Î ºÎ¸ð ÇÁ·Î¼¼½º´Â ´ÜÁö ÀÚ½Ä ¾²·¹µåÀÇ ¹ÂÅØ½º Àá±ÝÀ» Á¶»çÇÏ´Â °Í¸¸À¸·Îµµ »ç¿ëÇÒ ¼ö ÀÖ´Â ¹ÂÅØ½ºÀÎÁö ¾Æ´ÑÁö È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù. pthread_mutex_trylockÇÔ¼ö·Î ¹Ù·Î Àá±ÝÀ» ¾ò°í ÁøÀÔÀÌ °¡´ÉÇϸé, ³î°í ÀÖ´Â ÀÚ½Ä ¾²·¹µåÀÓÀ» ÀǹÌÇÏ´Â°Ô µÇ´Ï±î¿ä.

Á¶°Çº¯¼ö Çϳª·Î "ÀÛ¾÷ Áö½Ã°¡ ÀÖÀ» ¶§±îÁö ºÀ¼â", "ÀÛ¾÷ Áß ÁøÀÔ±ÝÁö"±îÁö Çѹø¿¡ ²ö³ª¹ö¸®´Â ±º¿ä.

ÀÚ·á ±¸Á¶

ÀÌ ÀڷᱸÁ¶´Â ºÎ¸ð ¾²·¹µå¿Í ÀÚ½Ä ¾²·¹µå°¡ °øÀ¯ÇÕ´Ï´Ù. ¹ÂÅØ½º¿Í Á¶°Çº¯¼ö, ¼ÒÄÏÁ¤º¸µîÀÌ µé¾î°©´Ï´Ù. ÀÚ½Ä ¾²·¹µå¸¶´Ù °¢°¢ÀÇ ¹ÂÅØ½º¿Í Á¶°Çº¯¼ö, ¼ÒÄÏÁ¤º¸¸¦ °¡Á®¾ß ÇϹǷΠÀÚ½Ä ¾²·¹µå °¹¼ö¸¸Å­ ¸¸µé¾î¼­ °ü¸®ÇØ¾ß ÇÕ´Ï´Ù.

ÀڷᱸÁ¶´Â ´ë·« ´ÙÀ½°ú °°À» °Ì´Ï´Ù.
class ThreadInfo 
{ 
    private: 
        pthread_cont_t mcond;  
        pthread_mutex_t mmutex; 
        int msocket; 
    public: 
        ThreadInfo(pthread_cond_t, pthread_mutex_t); 
        int TryLock(); 
        int Job(); 
        int UnLock(); 
}; 
 
  1. mcond : ½º·¹µå°¡ »ç¿ëÇÒ Á¶°Çº¯¼ö
  2. mmutex : ½º·¹µå°¡ »ç¿ëÇÒ ¹ÂÅØ½º
  3. TryLock() : Á¶°Çº¯¼ö¿Í ÇÔ²² »ç¿ëÇÒ ¹ÂÅØ½º Àá±ÝÀ» ¾ò±âÀ§ÇÑ ¸Þ¼­µå
  4. Job() : ÀÚ½Ä ¾²·¹µå°¡ ¼öÇàÇÒ Äڵ带 °¡Áø ¸Þ¼­µå
  5. UnLock() : ÀÚ½Ä ¾²·¹µå°¡ ÀÛ¾÷À» ¸¶Ä¡°í Àá±ÝÀ» µÇµ¹·ÁÁÖ±â À§Çؼ­ »ç¿ëÇÑ´Ù.

ÀÌ ÀڷᱸÁ¶´Â ÀÚ½Ä ¾²·¹µå °¹¼ö ¸¸Å­ »ý¼ºÇØ¾ß ÇϹǷΠ¹è¿­·Î °ü¸®ÇØ¾ß ÇÕ´Ï´Ù. STL vector·Î °ü¸®Çϱâ·Î Çß½À´Ï´Ù.
vector<ThreadInfo> ThreadList; 
 

¾²·¹µå Ç® ÇÁ·Î¼¼½º

¾²·¹µå Ç® ÇÁ·Î¼¼½º´Â ´ÙÀ½°ú °°½À´Ï´Ù. ³×Æ®¿öÅ© ¼­¹ö
  1. ¾²·¹µå Ç®À» ¸¸µç´Ù.
  2. ÁöÁ¤µÈ °¹¼ö ¸¸Å­ÀÇ ¾²·¹µå Ç®À» ¸¸µç´Ù. ¸ÞÀξ²·¹µå¿Í Àڽľ²·¹µå´Â ThreadInfo Ŭ·¡½º·Î Á¶°Çº¯¼ö¿Í ¹ÂÅØ½º¸¦ °øÀ¯ÇÑ´Ù. ÀÚ½Ä ¾²·¹µå´Â Á¶°Çº¯¼ö¿Í ¹ÂÅØ½º¸¦ ÃʱâÈ­ Çϰí, Job¸Þ¼­µå¸¦ ½ÇÇàÇÑ´Ù. Job ¸Þ¼­µå´Â ´ë·« ´ÙÀ½°ú °°À» °ÍÀÌ´Ù.

    Job() 
    { 
        GetLock(&mutex);                         // ¸ÕÀú Àá±ÝÀ» ¾ò´Â´Ù. 
        while(1) 
        { 
            // Á¶°Ç º¯¼ö·Î ±â´Ù¸°´Ù. Á¶°Ç º¯¼ö¸¦ ±â´Ù¸®¸é¼­ mutex Àá±ÝÀ» ³»³õÀ¸¸é, 
            // ºÎ¸ð ¾²·¹µå´Â mutex Àá±ÝÀ» ¾òÀ» ¼ö ÀÖ´Â »óŰ¡ µÇ´Âµ¥, 
            // ÀÌ´Â ¼±ÅÃÇÑ ÀÚ½Ä ¾²·¹µå°¡ ÀÛ¾÷À» ÇÒ ¼ö ÀÖ´Â »óŸ¦ ÀǹÌÇÑ´Ù.  
            pthread_cond_wait(&cond, &mutex);        
            // ºÎ¸ð ¾²·¹µå°¡ cont_signalÀ» Àü¼ÛÇϸé, _cond_wait´Â ¹ÝȯÇϰí 
            // Àá±ÝÀ» ¾ò´Â´Ù.   
         
            /* 
             * ÀÛ¾÷À» ÇÑ´Ù. 
             */ 
        
            // ÀÛ¾÷À» ¸¶Ä¡¸é, while ¹® óÀ½À¸·Î °¡¼­ pthread_cond_wait¸¦ È£ÃâÇÑ´Ù.  
        } 
    } 
     
  3. ÀÛ¾÷À» ÇÏ´Â µ¿¾ÈÀº ÀÚ½Ä ¾²·¹µå°¡ ¹ÂÅØ½º Àá±ÝÀ» ¾òÀº »óÅÂÀ̹ǷΠºÎ¸ð´Â TryLock ¸Þ¼­µå¸¦ È£ÃâÇÏ´Â °ÍÀ¸·Î ÀÌ ¾²·¹µå°¡ ÀÛ¾÷ ÁßÀÓÀ» ¾Ë ¼ö ÀÖ´Ù.
  4. ÀÛ¾÷À» ¸¶Ä¡¸é ´Ù½Ã Á¶°Çº¯¼ö¿¡¼­ ±â´Ù¸°´Ù.
  5. ¹Ýº¹...
ÀÌ ¹æ½ÄÀº ÀÚ½Ä ¾²·¹µå°¡ Àá±Ý ±ÇÇÑÀ» °¡Áö°í ½ÇÇàÇϱ⠶§¹®¿¡, µ¿±âÈ­ ¹®Á¦¿¡¼­ ÀÚÀ¯·Ó´Ù´Â ÀåÁ¡À» °¡Áø´Ù. ÀÚ½Ä ¾²·¹µå´Â ´ÜÁö pthread_cond_wait¸¦ È£Ãâ ÇÒ ¶§¸¸ Àá±ÝÀ» ³»³õ´Â´Ù.

¼ÀÇà ÄÚµå

Å×½ºÆ®¸¦ À§ÇÑ ÄÚµå. ÀߵȴÙ. ¼³¸íÀº ÁÖ¼®À¸·Î
001  #include <pthread.h>
002  #include <iostream>
003  #include <vector>
004  
005  #include <errno.h>
006  
007  #define THREAD_POOL_SIZE 5
008  
009  using namespace std;
010  
011  class Thread
012  {
013      private:
014          pthread_mutex_t mmutex;
015          pthread_cond_t mcond;
016      public:
017          int id;
018          Thread();
019          int GetLock();
020          int TryLock();
021          int UnLock();
022          int Job();
023          int Signal();
024  };
025  
026  // ¹ÂÅØ½º¿Í Á¶°Çº¯¼ö ÃʱâÈ­ 
027  Thread::Thread()
028  {
029      pthread_mutex_init(&mmutex, NULL);
030      pthread_cond_init(&mcond, NULL);
031  }
032  
033  // ¹ÂÅØ½º ÀÚ±Ý ¾ò±â
034  int Thread::GetLock()
035  {
036      return pthread_mutex_lock(&mmutex);
037  }
038  
039  // ¸ðÅØ½º Àá±Ý ¾ò±â ½Ãµµ
040  int Thread::TryLock()
041  {
042      return pthread_mutex_trylock(&mmutex);
043  }
044  
045  // Á¶°Çº¯¼ö¿¡ ½Ã±×³ÎÀ» Àü¼ÛÇÑ´Ù.
046  // ½Ã±×³ÎÀ» Àü¼ÛÇÑ ÈÄ¿¡´Â ¹ÂÅØ½º Àá±ÝÀ» µÇµ¹·ÁÁØ´Ù.
047  int Thread::Signal()
048  {
049      pthread_cond_signal(&mcond);
050      UnLock();
051  }
052  
053  // ¹ÂÅØ½º Àá±Ý µÇµ¹·ÁÁØ´Ù.
054  int Thread::UnLock()
055  {
056      pthread_mutex_unlock(&mmutex);
057  }
058  
059  // ÀÚ½Ä ¾²·¹µå¿¡¼­ ½ÇÇàÇÒ ÀÛ¾÷ ¸Þ¼­µå
060  int Thread::Job()
061  {
062      GetLock();
063      while(1)
064      {
065          pthread_cond_wait(&mcond, &mmutex);
066          // ÀÓ°è ¿µ¿ª -----------------------
067          // ÀÛ¾÷¿µ¿ªÀ¸·Î Àڽľ²·¹µå°¡ ÀÌ ¿µ¿ª¿¡ ¸Ó¹°·¯ ÀÖÀ» ¶§¿¡´Â
068          // ºÎ¸ð ¾²·¹µå°¡ TryLock·Î Àá±ÝÀ» ¾òÁö ¸øÇÑ´Ù.
069          cout << "Job Start " << id << endl;
070          sleep(3);
071          cout << "Job End " << id << endl;
072          // ---------------------------------
073      }
074  }
075  
076  // ¾²·¹µå ÇÔ¼ö
077  void *thread_func(void *arg)
078  {
079      Thread *lThread = (Thread *)arg;
080      lThread->Job();
081  }
082  
083  int main(int argc, char **argv)
084  {
085      int i = 0;
086      pthread_t p_thread;
087      vector<Thread *> ThreadList;
088      Thread *lThread;
089  
090      // ¾²·¹µå Ç®À» ¸¸µç´Ù.
091      for(i = 0; i < THREAD_POOL_SIZE; i++)
092      {
093          lThread = new Thread();
094          lThread->id = i+1;
095          ThreadList.push_back(lThread);
096          pthread_create(&p_thread, NULL, thread_func, (void *)lThread);
097          usleep(100);
098      }
099  
100      int mstat;
101      while(1)
102      {
103          // ÀÛ¾÷ °¡´ÉÇÑ ¾²·¹µå¸¦ ã¾Æ¼­
104          // Á¶°Çº¯¼ö ½Ã±×³ÎÀ» Àü¼ÛÇÑ´Ù.
105          for (i = 0; i < THREAD_POOL_SIZE; i++)
106          {
107              if((mstat = ThreadList[i]->TryLock()) == 0)
108              {
109                  ThreadList[i]->Signal();
110                  break;
111              }
112          }
113          sleep(1);
114      }
115  }
116  

¹«.. ¹®Á¦.

À§ ÇÁ·Î±×·¥Àº Àß µ¹¾Æ°¥ °Í °°Áö¸¸ ¸î °¡Áö ¹®Á¦Á¡ÀÌ ÀÖ´Ù.
  1. pthread mutexÀÇ Àá±ÝÀº Àá±ÝÀ» ¾òÀº ½º·¹µå¿¡¼­ Àá±ÝÀ» µÇµ¹·ÁÁà¾ßÇÑ´Ù. Àá±ÝÀ» ´Ù¸¥ ½º·¹µå¿¡¼­ ÇØÁ¦ÇÒ °æ¿ìÀÇ »óȲÀº Á¤ÀǵǾî ÀÖÁö ¾Ê´Ù. ¾î¶² ÀÏÀÌ ¹ß»ýÇÒÁö ¸ð¸¥´Ù.
    • ÀÏ´Ü Àá±ÝÀ» ¾òÀº ½º·¹µå¿¡¼­ Àá±ÝÀ» ÇØÁ¦ Çϵµ·Ï ¼öÁ¤ÇØ¾ß ÇÑ´Ù.
  2. Á¶°Çº¯¼ö¸¦ Á¦´ë·Î »ç¿ëÇϱâ À§Çؼ­´Â, ¹Ýµå½Ã wait ÇÔ¼ö·Î ¸ÕÀú ±â´Ù·Á¾ß ÇÑ´Ù. ±×·¯Áö ¾ÊÀ» °æ¿ì ½ÅÈ£¸¦ ÀÐ¾î ¹ö¸°´Ù. ±×·¯¹Ç·Î ¹Ýµå½Ã wait ÇÔ¼ö°¡ ¸ÕÀú È£Ã⠵ǵµ·Ï, Áï ÀÚ½Ä ½º·¹µå°¡ ¹Ýµå½Ã ¸ÕÀú ¹ÂÅØ½º¸¦ ¾òµµ·Ï ÀåÄ¡¸¦ ¸¶·ÃÇØ¾ß ÇÑ´Ù. flag °ªÀ» °Ë»çÇÏ´Â Á¤µµ·Î µÉ °Í °°´Ù.

´ÙÀ½Àº ÀÌ·¯ÇÑ ¹®Á¦¸¦ º¸°­ÇÑ ÄÚµå´Ù. Å×½ºÆ®¸¦ À§ÇÑ Äڵ嵵 Ãß°¡Çß´Ù.
#include <pthread.h> 
#include <iostream> 
#include <vector> 
#include <stdio.h> 
#include <string.h> 
 
#include <errno.h> 
 
#define THREAD_POOL_SIZE 5 
 
using namespace std; 
 
class Thread 
{ 
    private: 
        pthread_mutex_t mmutex; 
        pthread_cond_t mcond; 
        int value; 
    public: 
        int id; 
        int LockFlag; 
        Thread(); 
        int GetLock(); 
        int TryLock(); 
        int UnLock(); 
        int Job(); 
        int Signal(); 
        void SetValue(int a) 
        { 
            value = a; 
        } 
}; 
 
// ¹ÂÅØ½º¿Í Á¶°Çº¯¼ö ÃʱâÈ­  
Thread::Thread() 
{ 
    LockFlag = 1; 
    value = 0; 
    pthread_mutex_init(&mmutex, NULL); 
    pthread_cond_init(&mcond, NULL); 
} 
 
 
// ¸ðÅØ½º Àá±Ý ¾ò±â ½Ãµµ 
int Thread::TryLock() 
{ 
    int rtv; 
    if(LockFlag != 1) 
    { 
        return -1; 
    } 
       LockFlag = 0; 
    rtv = pthread_mutex_lock(&mmutex); 
    return 0; 
} 
 
// Á¶°Çº¯¼ö¿¡ ½Ã±×³ÎÀ» Àü¼ÛÇÑ´Ù. 
// ½Ã±×³ÎÀ» Àü¼ÛÇÑ ÈÄ¿¡´Â ¹ÂÅØ½º Àá±ÝÀ» µÇµ¹·ÁÁØ´Ù. 
int Thread::Signal() 
{ 
    pthread_cond_signal(&mcond); 
    UnLock(); 
} 
 
// ÀÚ½Ä ¾²·¹µå¿¡¼­ ½ÇÇàÇÒ ÀÛ¾÷ ¸Þ¼­µå 
int Thread::Job() 
{ 
    char fname[30]; 
    FILE *fp; 
    sprintf(fname, "Walk_%d.txt", id); 
    fp = fopen(fname,"w"); 
    while(1) 
    { 
        pthread_mutex_lock(&mmutex); 
 
        LockFlag = 1;         
        pthread_cond_wait(&mcond, &mmutex); 
        LockFlag = 0; 
         
        cout << "Walk " << id << endl; 
        fputs("Job\n", fp); 
        usleep(1000); 
        pthread_mutex_unlock(&mmutex); 
    } 
} 
 
// ¹ÂÅØ½º Àá±Ý µÇµ¹·ÁÁØ´Ù. 
int Thread::UnLock() 
{ 
    pthread_mutex_unlock(&mmutex); 
} 
 
 
// ¾²·¹µå ÇÔ¼ö 
void *thread_func(void *arg) 
{ 
    Thread *lThread = (Thread *)arg; 
    lThread->Job(); 
} 
 
int main(int argc, char **argv) 
{ 
    int i = 0; 
    int mstat; 
    pthread_t p_thread; 
    vector<Thread *> ThreadList; 
    Thread *lThread; 
    pthread_mutex_t mutex_lock; 
    pthread_mutexattr_t attr; 
    int kind; 
 
 
 
    // ¾²·¹µå Ç®À» ¸¸µç´Ù. 
    for(i = 0; i < THREAD_POOL_SIZE; i++) 
    { 
        lThread = new Thread(); 
        lThread->id = i+1; 
        ThreadList.push_back(lThread); 
        pthread_create(&p_thread, NULL, thread_func, (void *)lThread); 
        usleep(100); 
    } 
 
    FILE *fp; 
    fp = fopen("Job.txt","w"); 
    int j = 0; 
    while(1) 
    { 
        // ÀÛ¾÷ °¡´ÉÇÑ ¾²·¹µå¸¦ ã¾Æ¼­ 
        // Á¶°Çº¯¼ö ½Ã±×³ÎÀ» Àü¼ÛÇÑ´Ù. 
        for (i = 0; i < THREAD_POOL_SIZE; i++) 
        { 
            if((mstat = ThreadList[i]->TryLock()) == 0) 
            { 
                cout << "Job Signal " << i + 1<< endl; 
                fputs("Job Signal\n", fp); 
                ThreadList[i]->SetValue(i+1); 
                ThreadList[i]->Signal(); 
                break; 
            } 
        } 
        j ++; 
        if(j == 10000) break; 
        usleep(10); 
    } 
} 
 

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