쓰레드 내부 시스템 콜에의한 블록/ 타이머 쓰레드
글쓴이: iamsjkim / 작성시간: 월, 2003/10/06 - 2:12오전
(질문1)다음과 같이 코딩할 경우 a로부터 패킷입력이 없으면 Rx, Tx 쓰레드 둘다 블로킹되어버리는지 궁금합니다.
process : select() if( FD_ISSET(a,..)) -> Rx , Tx thread creation Rx thread : recv(a,..) Tx thread : send(a,..)
(Linux에서 gcc로 컴파일합니다..-.-)
(질문2)
다음과 같은 timer 쓰레드를 생성시키고 싶은데 어떻게 해야할지 난감합니다.
(무지의 소산으로 "programming with POSIX thread"책을 찾아봐도 잘 모르겠습니다..T.T)
timer thread creation > 기능 : thread 생성부터 t ms가 지나면 time_out_flga = 1로 세팅한다.
Forums:
1.[quote]process : select()
1.
thread로 만들었다면 select의 블럭과는 관계가 없을거 같군요.
2.타이머함수는 없는걸로 알고 있고요.
usleep이나 pthread_cond_timedwait나 아님 select를 이용하여 만들 수 있을 거예요.
process의 select와 합쳐서 만든다면
select의 인자의 마지막에 struct timeval *timeout에 값을 설정하여
별도의 thread없이 사용 할 수 있습니다.
세부적인 사용법은 man을 보고 사용하세요.
가장 단순한 형태의 타이머로...
아래내용은 맨페이지(man pthread_cond_timedwait)에 있는 샘플(타이머샘플 아닙니다. ^^;).
그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.
(^^)(__)감사드립니다. 그리고 또한가지..(.. )
제가 첫번째 질문을 약간 잘못해서요.. 다시 질문드리겠습니다.(에궁~T.T)
일단 a로부터 패킷입력이 되어 select가 반응하면
Rx, Tx 쓰레드가 생성되는데 a의 첫번째 패킷을 Rx 쓰레드가 recv()로 받을테고
그 후에 Rx쓰레드가 또 recv(a,..)를 호출한다고 가정하면 a로부터의 패킷이 더이상 들어오지 않을 경우 Rx, Tx 쓰레드 둘다 블록되는지요..?
process : select()
if( FD_ISSET(a,..)) -> Rx , Tx thread creation
Rx thread : recv(a,..) .. recv(a,..)
Tx thread : send(a,..)
RX의경우 블럭모드라면 블럭됩니다.TX는 블럭 안 됩니다.(데
RX의경우 블럭모드라면 블럭됩니다.
TX는 블럭 안 됩니다.
(데이터을 보낼때 블럭됩니다. 보낼 데이터가 없으므로 블럭 될 이유가 없습니다.)
TX와 RX는 무관합니다.
그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.
감사합니다.(확인차 한개더..-_-;;)
정말 감사드립니다.
제가 block여부에 관해 의문을 갖게 된 이유가, "programming with POSIX thread"라는 책(사실 번역판을 구입했지만..-_-;;)에서, "유저레벨 쓰레드의 경우 한 쓰레드에서, recv(), read()등의 시스템 콜에 의해 블록될 경우 동일한 프로세스의 다른 모든 쓰레드도 모두 블록된다.."고 써있었기때문입니다.
제가 코딩하는 쓰레드가 대체 유저레벨인지 커널레벨인지 이중레벨인지 몰라서요..ㅠ.ㅠ(무지한 죄로..)
그렇다면.. Rx 쓰레드는 패킷이 들어올때까지 블록되고 Tx의 경우 패킷을 전송시 블록되었다가 모두 전송한 뒤엔 Tx쓰레드는 블록상태가 해제되는것으로 이해하면 되겠군요^^(Rx, Tx 쓰레드 들이 서로에게 영향을 주지 않고..)
정말 정말 감사드립니다.
눈앞에 가득 끼었던 안개가 좀 엷어진 기분입니다^^*
음 그 경우는 블럭 될수도 있습니다.스레드도 여러 종류가 있는걸로 아
음 그 경우는 블럭 될수도 있습니다.
스레드도 여러 종류가 있는걸로 아는데.
하나의 프로세서로 쓰레드를 구성했을때
커널입장에서는 하나의 프로세서로 보기 때문에 블럭이 걸립니다.
그렇게 깊은 뜻으로 말씀하셨군요.
이건 RX/TX의 문제가 아니고 스레드의 방식에 따라서 발생하는 문제입니다.
참고로 Pthread의 경우 커널쓰레드군요.
http://linas.org/linux/threads-faq.html#ThreadsDefinition
그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.
[quote]제가 코딩하는 쓰레드가 대체 유저레벨인지 커널레벨인지 이중레
OS 와 그 버전에 따라 다를 수 있습니다.
다음 스레드를 참고하세요.
http://bbs.kldp.org/viewtopic.php?t=21072&highlight=user-level
우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자
아하 몰랐던걸 알았네요.....위에 '리눅스상에 pthread는' 으
아하 몰랐던걸 알았네요.....
위에 '리눅스상에 pthread는' 으로 고쳐야 겠군요.ㅎㅎ
그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.
OS와 그 버전에 따라 다를 수 있지만, 기본적으로는 리눅스 상에서의 p
OS와 그 버전에 따라 다를 수 있지만, 기본적으로는 리눅스 상에서의 pthread는 커널 레벨인 것으로 이해하면 되는것인지요..-.-
저의 경우 Wow 리눅스 7.3 Paran R2를 깔아서 사용중이고
Kernel 2.4.18
KDE 3.0.1
XFree86 4.2.0
glibc 2.2.5
gcc 2.95
라고 나와있습니다..
그렇다면.. 저의 경우 pthread_create를 사용하여 Rx 쓰레드를 생성, 그 내부에서 recv() 시스템 콜로 블록되더라도 pthread_create로 생성된 Tx 쓰레드는 영향을 받지 않겠군요..
(너무 초짜라 일일이 확인을.. T.T)
상세하고 친절한 답변 정말 감사드립니다..
(__)~꾸벅
댓글 달기