ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
![]()
Tweet
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();
};
vector<ThreadInfo> ThreadList; ¾²·¹µå Ç® ÇÁ·Î¼¼½º
¾²·¹µå Ç® ÇÁ·Î¼¼½º´Â ´ÙÀ½°ú °°½À´Ï´Ù. ³×Æ®¿öÅ© ¼¹ö
¼ÀÇà ÄÚµå
Å×½ºÆ®¸¦ À§ÇÑ ÄÚµå. ÀߵȴÙ. ¼³¸íÀº ÁÖ¼®À¸·Î 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
¹«.. ¹®Á¦.
À§ ÇÁ·Î±×·¥Àº Àß µ¹¾Æ°¥ °Í °°Áö¸¸ ¸î °¡Áö ¹®Á¦Á¡ÀÌ ÀÖ´Ù.
#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);
}
}
|
|
|
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|