2017-09-04 1 views
-2

클라이언트 - 서버 응용 프로그램이 있고 서버가 각 클라이언트 요청을 병렬 처리해야합니다. 그래서 각 요청마다 스레드를 생성하기로 결정했습니다. 이렇게하는 것이 좋은 생각입니까? 내부 스레드는 클라이언트에게 응답을 보낼 것이므로 스레드를 닫는 것에 대해 걱정하지 않아도됩니다.여러 요청을 처리하기 위해 여러 스레드를 만드는 것이 좋습니다.

void MyThreadFunction() 
{ 
    //Process request and send response to client 
    //..... 
    //..... 
    return; 
} 

int main() 
{ 
    //..... 
    //..... 

    while(true) 
    { 
     DWORD dwThreadId; 

     if(!receive(clientid, data)) //API to receive data from client 
     break; 

     CreateThread(NULL, 0, MyThreadFunction, NULL, 0, &dwThreadId); 
    } 

    return 1; 
} 
+0

그렇습니다. 다중 스레드 서버라고 부르지 만 일반적으로 연결을 잡아서 스레드가 클라이언트에 읽고 쓸 수있게합니다. –

+7

여러 스레드를 만드는 것은 필요하지는 않더라도 괜찮습니다.하지만 각 요청에 대한 스레드를 만드는 것은 좋지 않습니다. 스레드 풀을 대신 사용하십시오. 쓰래드는 생성/폐기 비용이 비싸며 각각의 스택이 필요하기 때문에 많은 메모리가 필요합니다. 필요한만큼 많이 사용하지만 더 이상은 사용하지 마십시오. – Carcigenicate

+1

C++ 11 이후로'std :: thread'를 사용할 수 있습니다. – Jarod42

답변

0

은 이렇게 할 수있는 좋은 생각인가?

아니요, 좋은 생각이 아닙니다.

Windows Vista 및 Server 2008부터는 (신제품) ThreadPool API을 사용할 수 있습니다.

들어오는 요청마다 새 스레드를 명시 적으로 작성하면 오버 헤드가 발생하여 서버 성능이 저하됩니다.

+0

C++ 11 std :: thread를 사용하여 OS 관련 API 대신 theradpool을 만들 수 있습니까? – impulse

+0

@impulse 그렇게 효율적이지는 않습니다. 'std :: thread'를 사용하면 스스로 스레드 풀을 롤백해야합니다. – user0042

+0

@impulse 어쨌든 [C++ 인터페이스] (http://www.dorodnic.com/blog/2015/10/17/windows-threadpool/)로 쉽게 감쌀 수 있습니다. – user0042

관련 문제