thread질문
글쓴이: ddoman / 작성시간: 토, 2002/12/28 - 4:49오후
class A
{
a( 패킷 ); //패킷을 넘겨받아 처리하는 함수
B socket_thread;
}
class B : public thread
{
어쩌구저쩌구 // 소켓용 thread class
}
위의 경우에 class A가 소켓용 쓰레드 B를 생성한 경우이고.
class B가 패킷을 받아서 class A의 a()함수에
넘겨주는 상황인데요.
물론 B의 객체는 루프를 돌고 있고, 리드할때마다 A의 a()에 넘겨주고..
while(1)
{
read( buffer, size );
parent->a( buffer, size );
}
암튼 class B의 루프안에서 A의 a()를 호출할때
a()가 리턴될때까지 B의 thread는 블럭이 되나요?
그렇다면 a()가 패킷을 처리하가 전까진 그동안은 리드하지 못한다는
것이겠네요?
블럭되지않게 할려면 어떤 방법을 써야할까요?
Forums:
물론 blocking이 됩니다.언뜻 생각하기에는 데이터를 처리 하
물론 blocking이 됩니다.
언뜻 생각하기에는 데이터를 처리 하는 쓰레드를 따로 생성하고
데이터를 거기로 던져서 데이터는 그넘이 처리하게 하고
소켓 읽는 넘은 제 갈길을 가도록 하는 방법이 있을꺼 같네요...
머.. 어떤 방식이든.. 소켓에서 읽는 쓰레드와 읽은 데이터를 처리하는 쓰레드로
분리하는 방법을 써야 할 것 같습니다.
보통은 분리해서 프로그래밍하지요....
:(
보통 open source중에 쓰레드를
이용한 프로그램들은 대부분 쓰레드 생성과 데이터 받는 부분,
데이터 처리부분은 분리를 해 줍니다.
주로 main()에서는 모든 쓰레드와 쓰레드간의 동기화 메카니즘을
enable시키고, 이 때 생성된 쓰레드끼리 서로 주고받고 알아서
할 수 있도록 작성해 줍니다.
간단하게 설명하면
Q data_send_q;
main()
{
q_init(data_send_q);
semaphore_init();
create_receive_thread();
create_received_data_process_thread();
}
create_receive_thread()
{
read_received_data();
write_q(data_send_q);
semaphore_give();
}
create_received_data_process_thread()
{
semaphore_take();
read_q(data_send_q);
process_received_data();
}
이런식으로 많이 작성합니다. 코드 스타일을 보면 주로
커널의 device driver나 RTOS 상에서 프로그밍하는 스타일입니다.
여기서 semaphore는 일반적은 유닉스의 IPC의 세마포어가 아니고
thread 고유의 동기화 메카니즘입니다.
왜냐하면, 그냥 유닉스나 리눅스의 IPC중의 세마포어를 쓰면
예상외의 결과가 나오는 경우가 생깁니다.
물론, 여기 스타일로는 그런일이 발생안할지도 모르지만,
일반적으로는 동기화에 문제가 생기기 때문에 쓰레도 고유의
동기화 메카니즘을 사용해야 합니다.
그럼, 조금이라도 도움이 되었길....
서명.....음, 서명이라...
아싸!!! Three Go!
thread with socket i/o
비단 socket i/o 뿐 아니라 다른 i/o인 경우도 마찬가지입니다.
thread를 써서 여러 i/o을 처리하는 경우, i/o 개당 하나의 thread를 할당하여야 non-block i/o처리가 됩니다.
그렇게 하지 않으려면, non-block i/o를 쓰고, polling이나 select를 하는 것이죠.
물론, 현실적인 문제를 해결하기 위해서는 이 두가지를 섞어서 쓸 수 있지만, 기본적으로 multi i/o 동시 처리를 위해서는
1. block-i/o 사용시 ( [n]i/o : [n]thread )
2. non-block-i/o 사용시 ( [n]i/o : [1]thread )
이 두가지 방법이 있다고 생각하면 됩니다.
댓글 달기