IBM pthread °¡À̵å, °³³ä, API ·¹ÆÛ·±½º http://www.as400.ibm.com/developer/threads/uguide/document.htm ¹Ì·¯»çÀÌÆ® : IBM main site
C++ÀÇ QpThread ¶óÀ̺귯¸®´Â system level ¾²·¹µå(POSIX thread) À§¿¡¼ ¾²·¹µå¿Í Unix signalÀ» À§ÇÑ C++ °´Ã¼ÁöÇⱸÁ¶¸¦ Á¦°øÇÑ´Ù. http://lin.fsid.cvut.cz/~kra/index.html
ThreadJack Àº Ç÷§Æû¿¡ »ó°ü¾ø´Â C++ class library·Î¼, Java¿Í À¯»çÇÑ ¸ÖƼ¾²·¹µå ÇÁ·Î±×·¡¹Ö ¸ðµ¨À» Á¦°øÇÑ´Ù. http://www.esm.co.jp/divisions/open-sys/ThreadJack/index-e.html ±×¸®°í ´ÙÀ½ÀÇ ÁÖ¼Ò¿¡¼ ¹ÞÀ» ¼ö ÀÖ´Ù. http://www.esm.co.jp/divisions/open-sys/ThreadJack/source-dl-e.html
APE´Â "APE Portable Environment"ÀÇ ¾àÀÚ·Î, UNIX (pthread)¿Í Win32 API¸¦ ±â¹ÝÀ¸·Î ¾îµð¼³ª ¾µ ¼ö ÀÖ´Â ¾²·¹µå ±â¹Ý ¼¹ö¸¦ Á¦°øÇÏ´Â C++ class ¶óÀ̺귯¸®ÀÌ´Ù. APE´Â ¾²·¹µå, ¼ÒÄÏ, ÆÄÀÏÁ¦¾î, µ¿±âÈ µµ±¸ µîÀÇ Ãß»ó class ¸¦ Á¦°øÇÑ´Ù. APEÀÇ ¸ñÀûÀº C++À» ÀÌ¿ëÇÏ¿© ÀÛ°í °£´ÜÇÑ ÇÁ·ÎÁ§Æ®¿¡¼µµ ½ÇÁ¦ÀûÀ̸鼵µ Æí¸®ÇÑ ¾²·¹µå±â¹Ý ¼¹ö¸¦ ¸¸µå´Â °ÍÀÌ´Ù. µû¶ó¼ ´Ü¼øÇÔ°ú ³·Àº ¿À¹öÇìµå°¡ Áß¿äÇÏ´Ù. http://www.voxilla.org/projects/projape.html
Portabale Thread Lib http://www.media.osaka-cu.ac.jp/~k-abe/PTL
Thread-Recyling in C++ http://www.sigs.de/html/kuhlmann.html
Æ©Å丮¾ó Àüü¸¦ ÇϳªÀÇ ÆÄÀÏ·Î ¾Æ·¡¿¡¼ ¹ÞÀ» ¼ö ÀÖ´Ù. http://www.milkywaygalaxy.freeservers.com "Source code c++ Programming howto"¸¦ Ŭ¸¯Ç϶ó.
¾²·¹µå Æ©Å丮¾óÀº http://www.math.arizona.edu/swig/pthreads/threads.html¿¡ ÀÖ´Ù.
HERT Æ©Å丮¾óÀº http://www.hert.org/docs/tutorials¿¡ ÀÖ°í, ¾²·¹µå¿¡ ´ëÇØ ã¾Æº¸·Á¸é ¿©±â·Î °¡¶ó.
linuxjournalÀÇ ¾²·¹µå ¼Ò°³±Û.
North Arizona Univ NAU
POSIX threads Acctcom multi-thread
ÀÌ ÀåÀº Ryan Teixeira ¿¡ ÀÇÇØ ¾²¿©Á³°í, ±× ¹®¼´Â ¿©±â¿¡ ÀÖ´Ù. .
¸ÖƼ ¾²·¹µå ÇÁ·Î±×·¡¹ÖÀº Á¡Á¡ Àα⸦ ¾ò°íÀÖ´Ù. ÀÌ ÀåÀº ¾²·¹µå¸¦ Áö¿øÇÏ´Â C++ classÀÇ µðÀÚÀÎÀ» º¸¿©ÁÙ °ÍÀÌ´Ù. mutex³ª ¼¼¸¶Æ÷¾î°°Àº ¾²·¹µå ÇÁ·Î±×·¡¹ÖÀÇ ¸î¸î Ãø¸éÀº ¿©±â¼ ³íÀǵÇÁö ¾Ê´Â´Ù. ¶ÇÇÑ ¾²·¹µåÀÇ °ü¸®¸¦ À§ÇÑ ½Ã½ºÅÛ ÄݵéÀº ÀϹÝÀûÀÎ ÇüÅ·Π³ªÅ¸³»¾ú´Ù.
¾²·¹µå¸¦ ÀÌÇØÇϱâ À§Çؼ´Â, ÇѲ¨¹ø¿¡ µ¹¾Æ°¡´Â ¿©·¯ ÇÁ·Î±×·¥À» »ý°¢ÇؾßÇÑ´Ù. ¶ÇÇÑ, ÀÌ ÇÁ·Î±×·¥µéÀÌ ¶È°°Àº Àü¿ªº¯¼ö¿Í ÇÔ¼öµé¿¡ Á¢±ÙÇÑ´Ù°í »ý°¢Çغ¸¾Æ¶ó. ÀÌ ÇÁ·Î±×·¥µéÀº ½Ç¿¡ ºñÀ¯µÉ ¼ö ÀÖ°í, ±×·¡¼ ¾²·¹µå¶ó°í ºÒ¸°´Ù. Áß¿äÇÑ Â÷ÀÌÁ¡ÀÌ ÀÖ´Ù¸é, °¢°¢ÀÇ ¾²·¹µå´Â ´Ù¸¥ ¾²·¹µå°¡ ÁøÇàÇÏ´Â °ÍÀ» ±â´Ù¸± Çʿ䰡 ¾ø´Ù´Â °ÍÀÌ´Ù. ¸ðµç ¾²·¹µå°¡ µ¿½Ã¿¡ ÁøÇàµÈ´Ù. ºñÀ¯¸¦ ÇÏÀÚ¸é, À̵éÀº À°»ó¼±¼ö¿Í °°ÀÌ ¾Æ¹«µµ ´Ù¸¥ ¼±¼ö¸¦ ±â´Ù¸®Áö ¾Ê´Â´Ù. °¢ÀÚ ÀÚ½ÅÀÇ ¼Óµµ·Î ÁøÇàµÇ´Â °ÍÀÌ´Ù.
¿Ö ¾²·¹µå¸¦ »ç¿ëÇÏ³Ä°í ¹°¾îº»´Ù¸é, ¾²·¹µå´Â Á¾Á¾ ¾îÇø®ÄÉÀ̼ÇÀÇ ¼º´ÉÀ» Çâ»ó½Ãų ¼ö ÀÖ°í, ±¸ÇöÇÏ´Â°Ô ±î´Ù·ÓÁö ¾Ê´Ù. Áï, Á¶±×¸¸ ÅõÀÚ·Î Å« È¿°ú¸¦ º¼ ¼ö ÀÖ´Â °ÍÀÌ´Ù. À̹ÌÁö¸¦ ¼ºñ½ºÇÏ´Â À̹ÌÁö ¼¹ö ÇÁ·Î±×·¥À» »ý°¢Çغ¸¾Æ¶ó. ÀÌ ÇÁ·Î±×·¥Àº ´Ù¸¥ ÇÁ·Î±×·¥À¸·ÎºÎÅÍ À̹ÌÁö¿¡ ´ëÇÑ ¿äûÀ» ¹Þ´Â´Ù. ±×·¯¸é ÀÌ À̹ÌÁö¸¦ µ¥ÀÌÅͺ£À̽º¿¡¼ ã¾Æ ¿äûÀ» º¸³½ ÇÁ·Î±×·¥¿¡°Ô ´Ù½Ã º¸³»ÁØ´Ù. ¸¸¾à ¼¹ö°¡ ÇϳªÀÇ ¾²·¹µå·Î ¸¸µé¾îÁ³´Ù¸é, Çѹø¿¡ ÇϳªÀÇ ÇÁ·Î±×·¥¸¸ ¿äûÀ» º¸³¾ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¸¸¾à ÇÁ·Î±×·¥ÀÌ À̹ÌÁö¸¦ ã°Å³ª º¸³»ÁÖ´Â ÁßÀ̶ó¸é ´Ù¸¥ ¿äûÀ» ó¸®ÇÒ ¼ö ¾øÀ» °ÍÀÌ´Ù. ¹°·Ð ÀÌ·¯ÇÑ ½Ã½ºÅÛÀ» ¾²·¹µå¸¦ ÀÌ¿ëÇÏÁö ¾Ê°íµµ ¸¸µé ¼ö ÀÖÁö¸¸, ¾²·¹µå¸¦ ¾²¸é, ¿©·¯°³ÀÇ ¿äûÀ» ¾ÆÁÖ ÀÚ¿¬½º·´°Ô ó¸®ÇÒ ¼ö ÀÖ°Ô µÈ´Ù. °£´ÜÇÑ Á¢±Ù ¹æ¹ýÀº ÇϳªÀÇ ¿äû´ç ÇϳªÀÇ ¾²·¹µå¸¦ ¸¸µå´Â °ÍÀÌ´Ù. ¸ÞÀÎ ¾²·¹µå´Â ¿äû¿¡ µû¶ó ¾²·¹µå¸¦ ¸¸µé¾îÁֱ⸸ ÇÏ¸é µÈ´Ù. ±×·¯¸é »õ·Î ¸¸µé¾îÁø ¾²·¹µå°¡ ¿äûÇÏ´Â ÇÁ·Î±×·¥°ú ´ëÈÇÏ¸é¼ ¼ºñ½º¸¦ ÇØÁÖ¸é µÈ´Ù. À̹ÌÁö¸¦ ã¾Æ¼ º¸³½ ÈÄ¿¡´Â ¾²·¹µå°¡ ½º½º·Î Á¾·áÇÏ¸é µÈ´Ù. ÀÌ·¸°Ô Çϸé ÇϳªÀÇ ¿äûÀ» ¼ºñ½º ÇÏ´Â µµÁß¿¡µµ ´Ù¸¥ ¿äûÀ» ¹ÞÀ» ¼ö ÀÖ´Â À¯¿¬ÇÑ ½Ã½ºÅÛÀÌ µÉ °ÍÀÌ´Ù.
¾²·¹µå¸¦ ¸¸µé±â À§Çؼ´Â, ¾²·¹µåÀÇ ½ÃÀÛÁ¡ÀÌ µÉ ÇÔ¼ö¸¦ ¸í½ÃÇØ¾ß ÇÑ´Ù. ¿î¿µÃ¼Á¦ ·¹º§¿¡¼´Â, À̰ÍÀÌ ÀϹÝÀûÀÎ ÇÔ¼öÀÌ´Ù. ±×·±µ¥ C++ÀÇ class ¸â¹öÇÔ¼ö´Â ½ÃÀÛÇÔ¼ö°¡ µÉ ¼ö ¾ø±â ¶§¹®¿¡ ¾à°£ÀÇ Æ®¸¯À» ½á¾ßÇÑ´Ù. ÇÏÁö¸¸, Ŭ·¡½ºÀÇ static ¸â¹öÇÔ¼ö´Â °¡´ÉÇÏ´Ù. À̰ÍÀÌ ¿ì¸®°¡ ½ÃÀÛÇÔ¼ö·Î ÀÌ¿ëÇÒ °ÍÀÌ´Ù. static ¸â¹öÇÔ¼ö´Â C++ °´Ã¼ÀÇ this Æ÷ÀÎÅ͸¦ »ç¿ëÇÒ ¼ö ¾ø´Ù. À̵éÀº ¿ÀÁ÷ static µ¥ÀÌÅ͸¸ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. ´ÙÇàÈ÷µµ ¹æ¹ýÀÌ ÀÖ´Ù. ¾²·¹µåÀÇ ½ÃÀÛÁ¡ ÇÔ¼ö´Â ÀÎÀÚ·Î void *¸¦ °®°Ô µÇ´Âµ¥, À̸¦ ¾²·¹µå ¾È¿¡¼ ¾î¶² ŸÀÔÀ¸·Î³ª casting ÇØ¼ ¾µ ¼ö ÀÖ´Ù. ¿ì¸®´Â À̸¦ static ÇÔ¼ö¿¡ this ¸¦ ³Ñ°ÜÁÖ±â À§ÇØ ¾µ °ÍÀÌ´Ù. µû¶ó¼ static ÇÔ¼ö´Â À̸¦ casting ÇÏ¿© staticÀÌ ¾Æ´Ñ ÇÔ¼ö¸¦ ºÎ¸£±â À§ÇØ ¾µ ¼ö ÀÖ´Ù.
¿ì¸®´Â ¾à°£ Á¦ÇÑµÈ ±â´ÉÀ» °®´Â ¾²·¹µå 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ÇØ¶ó.
thread class¸¦ »ç¿ëÇϱâ À§Çؼ´Â, »õ·Î¿î class¸¦ ¸¸µé¾î¾ß ÇÑ´Ù. ±×¸®°í ¸¸µé°íÀÚ ÇÏ´Â ±â´ÉÀ» À§ÇØ Execute()¸¦ overrideÇÏ¸é µÈ´Ù. ¶ÇÇÑ, Execute°¡ ºÒ¸®±â ÀüÀÇ Ãʱâȸ¦ À§ÇØ Setup()À» overrideÇÒ ¼öµµ ÀÖ´Ù. ¸¸¾à, Setup()À» overrideÇÑ´Ù¸é, ºÎ¸ð classÀÇ Setup()À» ºÎ¸£´Â °ÍÀ» ±â¾ïÇ϶ó.
ÀÌ ÀåÀº C++·Î ¾²·¹µå classÀÇ ±¸ÇöÀ» »ìÆìº¸¾Ò´Ù. ¹°·Ð À̰ÍÀº ´Ü¼øÇÑ Á¢±Ù¹æ¹ýÀ̰í, ´õ ÁÁÀº µðÀÚÀÎÀ» À§ÇÑ ±âÃÊ·Î ¾²ÀÏ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
¸¸¾à ÄÚ¸àÆ®³ª Á¦¾ÈÇÏ°í ½ÍÀº °ÍÀÌ ÀÖÀ¸¸é, ¸ÞÀÏÀ» ½áÁֱ⠹ٶõ´Ù. Ryan Teixeira