C언어

thread pool

고요한하늘... 2010. 1. 15. 17:46

thread pool을 어떻게 구현하는지 살펴보자


일단은 지정한 개수 만큼 thread를 생성하자


for( i = 0; i < 10; i++ )

    pthread_create( &tid, NULL, &thread_main, (void*)arg );


이렇게 10개의 thread를 생성시켜 놓는다.


만약 만들려고 하는것이 daemon이라면

client 에서 접속 요청을 할것이고 접속 요청을 daemon에서 받기 위해서는


socket()을 만들고

bind()를 한다.

그리고 listen을 하고 있다가

client()에서 접속 요청이 오면

accept()를 하는 순서로 작업이 진행된다.


accept()의 결과물로 연결된 socket fd가 넘어오게 되고

결과적으로 쓰레드에서 사용하게될 가장 중요한 자원으로 socket fd가 쓰레드별로 할당된다.


앞에 for문에서 생성된 thread들은 thread_main에 진입하지만

thread_main안에 있는

pthread_cond_wait()때문에 대기상태에 놓이고

main thread에서 accept()가 실행된후

pthread_cond_singal()을 호출하여

대기 상태에 놓인 thread를 실행 시킨다.



* accept()롤 통해서 얻은 socket fd를 queue로 관리한다고 할때

set_queue(int fd)와, get_fd()에서 각각

condition(pthread_cond_t)을 설정하면 된다.


set_queue()에서는 

queue[i++] = fd


get_fd()에서는

fd = queue[i--];



set_fd()와 get_fd()내부에서는 mutex와 conditioin을 통해서 queue에 접근하는 것을 통제해야 한다.

queue가 모두 차 있을때 mutex를 통해서 대기를 시키고( set_fd() )

반대로 queue가 비어있을때에도 mutex를 통해서 대기상태로 만들어야 한다.( get_fd) )

이들이 대기상태에 놓었을때 깨어 나게 하는것은 

set_fd()의 경우 get_fd()에서 하나의 fd를 할당받고 난 직후 cond_singnal()을 호출하면서 이뤄지고

get_fd()의 경우는 set_fd()에서 queue에 fd가 추가되고 난 직후 cond_singnal()을 초루하면서 이뤄진다.



-- 작성 중 --

'C언어' 카테고리의 다른 글

label xxx defined but not used  (0) 2010.05.18
bit counting  (0) 2010.04.28
메세지 크래커  (0) 2009.08.10
sendfile  (0) 2009.08.05
DOXYGEN & graphviz  (0) 2009.06.10