18. C++¿¡¼­ÀÇ ¾²·¹µå

18.1. ¾²·¹µå Æ©Å丮¾ó

18.2. C++¿¡¼­ ¾²·¹µå class µðÀÚÀÎÇϱâ

ÀÌ ÀåÀº Ryan Teixeira ¿¡ ÀÇÇØ ¾²¿©Á³°í, ±× ¹®¼­´Â ¿©±â¿¡ ÀÖ´Ù. .

18.2.1. ¼Ò°³

¸ÖƼ ¾²·¹µå ÇÁ·Î±×·¡¹ÖÀº Á¡Á¡ Àα⸦ ¾ò°íÀÖ´Ù. ÀÌ ÀåÀº ¾²·¹µå¸¦ Áö¿øÇÏ´Â C++ classÀÇ µðÀÚÀÎÀ» º¸¿©ÁÙ °ÍÀÌ´Ù. mutex³ª ¼¼¸¶Æ÷¾î°°Àº ¾²·¹µå ÇÁ·Î±×·¡¹ÖÀÇ ¸î¸î Ãø¸éÀº ¿©±â¼­ ³íÀǵÇÁö ¾Ê´Â´Ù. ¶ÇÇÑ ¾²·¹µåÀÇ °ü¸®¸¦ À§ÇÑ ½Ã½ºÅÛ ÄݵéÀº ÀϹÝÀûÀÎ ÇüÅ·Π³ªÅ¸³»¾ú´Ù.

18.2.2. ¾²·¹µå¿¡ ´ëÇÑ °£´ÜÇÑ ¼Ò°³

¾²·¹µå¸¦ ÀÌÇØÇϱâ À§Çؼ­´Â, ÇѲ¨¹ø¿¡ µ¹¾Æ°¡´Â ¿©·¯ ÇÁ·Î±×·¥À» »ý°¢ÇؾßÇÑ´Ù. ¶ÇÇÑ, ÀÌ ÇÁ·Î±×·¥µéÀÌ ¶È°°Àº Àü¿ªº¯¼ö¿Í ÇÔ¼öµé¿¡ Á¢±ÙÇÑ´Ù°í »ý°¢Çغ¸¾Æ¶ó. ÀÌ ÇÁ·Î±×·¥µéÀº ½Ç¿¡ ºñÀ¯µÉ ¼ö ÀÖ°í, ±×·¡¼­ ¾²·¹µå¶ó°í ºÒ¸°´Ù. Áß¿äÇÑ Â÷ÀÌÁ¡ÀÌ ÀÖ´Ù¸é, °¢°¢ÀÇ ¾²·¹µå´Â ´Ù¸¥ ¾²·¹µå°¡ ÁøÇàÇÏ´Â °ÍÀ» ±â´Ù¸± Çʿ䰡 ¾ø´Ù´Â °ÍÀÌ´Ù. ¸ðµç ¾²·¹µå°¡ µ¿½Ã¿¡ ÁøÇàµÈ´Ù. ºñÀ¯¸¦ ÇÏÀÚ¸é, À̵éÀº À°»ó¼±¼ö¿Í °°ÀÌ ¾Æ¹«µµ ´Ù¸¥ ¼±¼ö¸¦ ±â´Ù¸®Áö ¾Ê´Â´Ù. °¢ÀÚ ÀÚ½ÅÀÇ ¼Óµµ·Î ÁøÇàµÇ´Â °ÍÀÌ´Ù.

¿Ö ¾²·¹µå¸¦ »ç¿ëÇÏ³Ä°í ¹°¾îº»´Ù¸é, ¾²·¹µå´Â Á¾Á¾ ¾îÇø®ÄÉÀ̼ÇÀÇ ¼º´ÉÀ» Çâ»ó½Ãų ¼ö ÀÖ°í, ±¸ÇöÇÏ´Â°Ô ±î´Ù·ÓÁö ¾Ê´Ù. Áï, Á¶±×¸¸ ÅõÀÚ·Î Å« È¿°ú¸¦ º¼ ¼ö ÀÖ´Â °ÍÀÌ´Ù. À̹ÌÁö¸¦ ¼­ºñ½ºÇÏ´Â À̹ÌÁö ¼­¹ö ÇÁ·Î±×·¥À» »ý°¢Çغ¸¾Æ¶ó. ÀÌ ÇÁ·Î±×·¥Àº ´Ù¸¥ ÇÁ·Î±×·¥À¸·ÎºÎÅÍ À̹ÌÁö¿¡ ´ëÇÑ ¿äûÀ» ¹Þ´Â´Ù. ±×·¯¸é ÀÌ À̹ÌÁö¸¦ µ¥ÀÌÅͺ£À̽º¿¡¼­ ã¾Æ ¿äûÀ» º¸³½ ÇÁ·Î±×·¥¿¡°Ô ´Ù½Ã º¸³»ÁØ´Ù. ¸¸¾à ¼­¹ö°¡ ÇϳªÀÇ ¾²·¹µå·Î ¸¸µé¾îÁ³´Ù¸é, Çѹø¿¡ ÇϳªÀÇ ÇÁ·Î±×·¥¸¸ ¿äûÀ» º¸³¾ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¸¸¾à ÇÁ·Î±×·¥ÀÌ À̹ÌÁö¸¦ ã°Å³ª º¸³»ÁÖ´Â ÁßÀ̶ó¸é ´Ù¸¥ ¿äûÀ» ó¸®ÇÒ ¼ö ¾øÀ» °ÍÀÌ´Ù. ¹°·Ð ÀÌ·¯ÇÑ ½Ã½ºÅÛÀ» ¾²·¹µå¸¦ ÀÌ¿ëÇÏÁö ¾Ê°íµµ ¸¸µé ¼ö ÀÖÁö¸¸, ¾²·¹µå¸¦ ¾²¸é, ¿©·¯°³ÀÇ ¿äûÀ» ¾ÆÁÖ ÀÚ¿¬½º·´°Ô ó¸®ÇÒ ¼ö ÀÖ°Ô µÈ´Ù. °£´ÜÇÑ Á¢±Ù ¹æ¹ýÀº ÇϳªÀÇ ¿äû´ç ÇϳªÀÇ ¾²·¹µå¸¦ ¸¸µå´Â °ÍÀÌ´Ù. ¸ÞÀÎ ¾²·¹µå´Â ¿äû¿¡ µû¶ó ¾²·¹µå¸¦ ¸¸µé¾îÁֱ⸸ ÇÏ¸é µÈ´Ù. ±×·¯¸é »õ·Î ¸¸µé¾îÁø ¾²·¹µå°¡ ¿äûÇÏ´Â ÇÁ·Î±×·¥°ú ´ëÈ­Çϸ鼭 ¼­ºñ½º¸¦ ÇØÁÖ¸é µÈ´Ù. À̹ÌÁö¸¦ ã¾Æ¼­ º¸³½ ÈÄ¿¡´Â ¾²·¹µå°¡ ½º½º·Î Á¾·áÇÏ¸é µÈ´Ù. ÀÌ·¸°Ô Çϸé ÇϳªÀÇ ¿äûÀ» ¼­ºñ½º ÇÏ´Â µµÁß¿¡µµ ´Ù¸¥ ¿äûÀ» ¹ÞÀ» ¼ö ÀÖ´Â À¯¿¬ÇÑ ½Ã½ºÅÛÀÌ µÉ °ÍÀÌ´Ù.

18.2.3. ±âº»ÀûÀÎ Á¢±Ù¹æ¹ý

¾²·¹µå¸¦ ¸¸µé±â À§Çؼ­´Â, ¾²·¹µåÀÇ ½ÃÀÛÁ¡ÀÌ µÉ ÇÔ¼ö¸¦ ¸í½ÃÇØ¾ß ÇÑ´Ù. ¿î¿µÃ¼Á¦ ·¹º§¿¡¼­´Â, À̰ÍÀÌ ÀϹÝÀûÀÎ ÇÔ¼öÀÌ´Ù. ±×·±µ¥ C++ÀÇ class ¸â¹öÇÔ¼ö´Â ½ÃÀÛÇÔ¼ö°¡ µÉ ¼ö ¾ø±â ¶§¹®¿¡ ¾à°£ÀÇ Æ®¸¯À» ½á¾ßÇÑ´Ù. ÇÏÁö¸¸, Ŭ·¡½ºÀÇ static ¸â¹öÇÔ¼ö´Â °¡´ÉÇÏ´Ù. À̰ÍÀÌ ¿ì¸®°¡ ½ÃÀÛÇÔ¼ö·Î ÀÌ¿ëÇÒ °ÍÀÌ´Ù. static ¸â¹öÇÔ¼ö´Â C++ °´Ã¼ÀÇ this Æ÷ÀÎÅ͸¦ »ç¿ëÇÒ ¼ö ¾ø´Ù. À̵éÀº ¿ÀÁ÷ static µ¥ÀÌÅ͸¸ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. ´ÙÇàÈ÷µµ ¹æ¹ýÀÌ ÀÖ´Ù. ¾²·¹µåÀÇ ½ÃÀÛÁ¡ ÇÔ¼ö´Â ÀÎÀÚ·Î void *¸¦ °®°Ô µÇ´Âµ¥, À̸¦ ¾²·¹µå ¾È¿¡¼­ ¾î¶² ŸÀÔÀ¸·Î³ª casting ÇØ¼­ ¾µ ¼ö ÀÖ´Ù. ¿ì¸®´Â À̸¦ static ÇÔ¼ö¿¡ this ¸¦ ³Ñ°ÜÁÖ±â À§ÇØ ¾µ °ÍÀÌ´Ù. µû¶ó¼­ static ÇÔ¼ö´Â À̸¦ casting ÇÏ¿© staticÀÌ ¾Æ´Ñ ÇÔ¼ö¸¦ ºÎ¸£±â À§ÇØ ¾µ ¼ö ÀÖ´Ù.

18.2.4. ±¸Çö

¿ì¸®´Â ¾à°£ Á¦ÇÑµÈ ±â´ÉÀ» °®´Â ¾²·¹µå class¸¦ ¸¸µé °ÍÀÌ´Ù. ½ÇÁ¦ ¾²·¹µå´Â ÀÌ class°¡ ÇÏ´Â °Íº¸´Ù ÈξÀ ¸¹Àº ÀϵéÀ» ÇÒ ¼ö ÀÖ´Ù.

class Thread
{
   public:
      Thread();
      int Start(void * arg);
   protected:
      int Run(void * arg);
      static void * EntryPoint(void*);
      virtual void Setup();
      virtual void Execute(void*);
      void * Arg() const {return Arg_;}
      void Arg(void* a){Arg_ = a;}
   private:
      THREADID ThreadId_;
      void * Arg_;

};

Thread::Thread() {}

int Thread::Start(void * arg)
{
   Arg(arg); // user µ¥ÀÌÅ͸¦ ÀúÀåÇÔ.
   int code = thread_create(Thread::EntryPoint, this, & ThreadId_);
   return code;
}

int Thread::Run(void * arg)
{
   Setup();
   Execute( arg );
}

/*static */
void * Thread::EntryPoint(void * pthis)
{
   Thread * pt = (Thread*)pthis;
   pthis->Run( Arg() );
}

virtual void Thread::Setup()
{
        // Setup¿¡ ÇØ´çÇÏ´Â Àϵé
}

virtual void Thread::Execute(void* arg)
{
        // ½ÇÇàÇÒ ³»¿ë
}

¿ì¸®°¡ ¾²·¹µå¸¦ C++ °´Ã¼·Î »ç¿ëÇϰíÀÚ ÇÑ´Ù´Â °ÍÀ» ÀÌÇØÇÏ´Â °ÍÀÌ Áß¿äÇÏ´Ù. °¢°¢ÀÇ °´Ã¼´Â ÇϳªÀÇ ¾²·¹µå¿¡ ´ëÇÑ ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÑ´Ù. ¾²·¹µå¿Í °´Ã¼´Â ´Ù¸£´Ù. °´Ã¼´Â ¾²·¹µå ¾øÀÌ Á¸ÀçÇÒ ¼ö ÀÖ´Ù. ÀÌ ±¸Çö¿¡¼­, ¾²·¹µå ÀÚü´Â Start ÇÔ¼ö°¡ ºÒ¸± ¶§±îÁö Á¸ÀçÇÏÁö ¾Ê´Â´Ù.

¿©±â¼­ userÀÇ ÀÎÀÚ¸¦ class¿¡ ÀúÀåÇѴٴµ¥ ÁÖÀÇÇØ¶ó. ÀÌ´Â ¾²·¹µå°¡ ½ÃÀÛµÉ ¶§±îÁö Àӽ÷ΠÀ̸¦ ÀúÀåÇÒ °ø°£ÀÌ ÇÊ¿äÇϱ⠶§¹®ÀÌ´Ù. ¿î¿µÃ¼Á¦ ¾²·¹µå´Â ÀÎÀÚ¸¦ Çϳª ³Ñ±æ ¼ö ÀÖ°Ô ÇØÁÖÁö¸¸, ¿ì¸®´Â this ¶§¹®¿¡ À̸¦ Á÷Á¢ ³Ñ°ÜÁÙ ¼ö ¾ø´Ù. ±×·¡¼­ ¿ì¸®´Â ÀÎÀÚ¸¦ Àá½Ã class¿¡ ÀúÀåÇß´Ù°¡ ÇÔ¼ö°¡ ½ÃÀÛµÉ ¶§ ´Ù½Ã ²¨³»¼­ ³Ñ°ÜÁÖ°Ô µÈ´Ù.

Thread(); »ý¼ºÀÚÀÌ´Ù.

int Start(void * arg); ÀÌ ÇÔ¼ö´Â ¾²·¹µå¸¦ ¸¸µé°í, À̸¦ ½ÃÀÛÇÏ°Ô ÇØÁØ´Ù. ÀÌ ÀÎÀÚ´Â ¾²·¹µå¿¡ µ¥ÀÌÅ͸¦ ³Ñ°ÜÁÖ±â À§ÇØ »ç¿ëµÇ°í, Start()´Â ¿î¿µÃ¼Á¦ÀÇ ¾²·¹µå »ý¼º ÇÔ¼ö¸¦ ºÎ¸§À¸·Î½á ¾²·¹µå¸¦ ¸¸µç´Ù.

int Run(void * arg); ÀÌ ÇÔ¼ö´Â °Çµå¸®¸é ¾ÈµÇ´Â ÇÔ¼öÀÌ´Ù.

static void * EntryPoint(void * pthis); ÀÌ ÇÔ¼ö´Â ¾²·¹µåÀÇ ½ÃÀÛ Á¡ ¿ªÇÒÀ» ÇÑ´Ù. ÀÌ ÇÔ¼ö´Â ´Ü¼øÈ÷ pthis¸¦ Thread *·Î castingÇØ¼­ Run ÇÔ¼ö¸¦ ºÒ·¯ÁØ´Ù.

virtual void Setup(); ÀÌ ÇÔ¼ö´Â ¾²·¹µå°¡ ¸¸µé¾îÁø ÈÄ, ½ÇÇàÀÌ ½ÃÀ۵DZâ Àü¿¡ ºÒ·ÁÁø´Ù. ÀÌ ÇÔ¼ö¸¦ override ÇÒ ¶§´Â, ºÎ¸ð classÀÇ Setup()¸¦ ºÎ¸£´Â °ÍÀ» ±â¾ïÇ϶ó.

virtual void Execute(void *); ÇϰíÀÚ ÇÏ´Â ÀÏÀ» À§ÇØ ÀÌ ÇÔ¼ö¸¦ overrideÇØ¶ó.

18.2.5. Thread Class »ç¿ëÇϱâ

thread class¸¦ »ç¿ëÇϱâ À§Çؼ­´Â, »õ·Î¿î class¸¦ ¸¸µé¾î¾ß ÇÑ´Ù. ±×¸®°í ¸¸µé°íÀÚ ÇÏ´Â ±â´ÉÀ» À§ÇØ Execute()¸¦ overrideÇÏ¸é µÈ´Ù. ¶ÇÇÑ, Execute°¡ ºÒ¸®±â ÀüÀÇ ÃʱâÈ­¸¦ À§ÇØ Setup()À» overrideÇÒ ¼öµµ ÀÖ´Ù. ¸¸¾à, Setup()À» overrideÇÑ´Ù¸é, ºÎ¸ð classÀÇ Setup()À» ºÎ¸£´Â °ÍÀ» ±â¾ïÇ϶ó.

18.2.6. °á·Ð

ÀÌ ÀåÀº C++·Î ¾²·¹µå classÀÇ ±¸ÇöÀ» »ìÆìº¸¾Ò´Ù. ¹°·Ð À̰ÍÀº ´Ü¼øÇÑ Á¢±Ù¹æ¹ýÀ̰í, ´õ ÁÁÀº µðÀÚÀÎÀ» À§ÇÑ ±âÃÊ·Î ¾²ÀÏ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

¸¸¾à ÄÚ¸àÆ®³ª Á¦¾ÈÇÏ°í ½ÍÀº °ÍÀÌ ÀÖÀ¸¸é, ¸ÞÀÏÀ» ½áÁֱ⠹ٶõ´Ù. Ryan Teixeira