multithread 에서 select() 사용할때의 문제점?
글쓴이: bw001730 / 작성시간: 월, 2004/09/13 - 4:39오후
read() 함수에 타임아웃을 주기 위하여
select() 함수를 사용하여
tcp_timedreadn(sock,buf+4, content_size, waitsec);
이런식으로 만들었습니다.
내부에는 대충
int readable_timeo(int fd, int sec)
{
fd_set rset;
struct timeval tv;
FD_ZERO(&rset);
tv.tv_sec = sec;
tv.tv_usec = 0;
return (select (fd+1, &rset, NULL, NULL, &tv) );
}
이런식으로 있는데요
이게 멀티스레드에서 도 가능한가요?
멀티스레드에서 select()를 다중으로 호출하면
상관없나요?
자꾸 에러가 나는데 아마 이때문인거 같아서요..
즐삽중...
Forums:
음.. 위 코드 문제 없어 보입니다.또한 멀티 스레드 환경 하 s
음.. 위 코드 문제 없어 보입니다.
또한 멀티 스레드 환경 하 select 를
사용한 timeout 체크는 문제 없습니다. ㅎ
“바람에게도 길은 있다. 나는 비로소 나의 길을 가느니. 길은 언제나 어디에나 있다.”
아..그런가요?
제가 질문을 좀 풀어서 드려볼께요
스레드1,2,3 세개의 스레드가 있습니다.
time_read()를 호출합니다. timed_read()내부에는 select()가 있구요
동시에 3개의 스레드가 timed_read()를 호출합니다.
세개의 스레드 모두 select()에서 타임아웃을 기다리고 있습니다.
실제로 어떤 소켓번호가 readable 상태가 될 때까지 기다리는 것인데요
스레드1이 기다리고 있는 소켓번호가 readable상태가 되었을때
커널이 스레드1을 깨워줄수 있는가 하는게 궁금했습니다.
제 생각에도 될것 같은데 확인차 질문을 한번만 더 드립니당
답변감사합니다.
세개의 스레드가 같은 fd에 대해서 select() 호출을 할 경우 fd
세개의 스레드가 같은 fd에 대해서 select() 호출을 할 경우 fd가 준비가 되었을때 커널은 3개의 스레드 다를 깨웁니다. 어느 한놈만 깨우지는 않습니다.
어느 하나의 스레드만 깨울려면 select() 호출을 어느 하나만 하게 해야 합니다. 이 방법 mutex을 써서 하나의 스레드만 select() 호출을 하도록 해야.
---------
간디가 말한 우리를 파괴시키는 7가지 요소
첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스
이익추구를 위해서라면..
다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치
아.....그렇군요답변 정말 감사드립니다.
아.....그렇군요
답변 정말 감사드립니다.
[quote="IsExist"]세개의 스레드가 같은 fd에 대해서 sel
good answer!
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
prefork도 마찬가지입니다.
하나의 fd에 대해서 fork하는
prefork 했을시에도 select는 동시에 발생합니다.
어짜피 커널단에서 처리하니 동일하겠죠..
Re: multithread 에서 select() 사용할때의 문제점?
흠.. 대충 코드라서 그런지 rset 에 fd 같은 걸 설정안 해 주신 듯 한데요..
멀티스레드로 돌리셨다고 하고, I/O 멀티플랙싱을 안 하셨다고 하고,
보여주신 함수의 파라메터를 보면 하나의 소켓에 대해서만 select가 들어가는 것으로 보이는데요,
이 경우에는 다른쪽 fd가 ready가 되어도 그 fd를 fd_set에 가지고 있지 않은 쪽은 영향을 받지 않을 것 같습니다.
어떤 오류가 발생하는지 호출한 함수(시스템콜)와 에러번호, 메시지,
그리고 좀 복잡한 경우이면 실행문맥을 알려주시면 좀 더 쉽게 도움을 받으실 수 있지 않겠어요?
이런...
그렇네요
rset에 add 안해줬네요
답변감사합니다.
( 흑..이런 허접탱이를 봤나..)
하나의 fd를 멀티쓰레드에서 select()한다면 event는?
하나의 소켓 fd번호를 여러 쓰레드에서 동시에 select()하고 있다면
소켓이벤트는 하나만 발생합니다.
소켓fd가 블럭킹이건 논블럭킹이건 이벤트는 하나만 발생합니다.
테스트해보시면 금방 알 수 있습니다.
Re: 하나의 fd를 멀티쓰레드에서 select()한다면 event는?
select에서 보는건 process 여서 그런가요?
---------
간디가 말한 우리를 파괴시키는 7가지 요소
첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스
이익추구를 위해서라면..
다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치
Re: 하나의 fd를 멀티쓰레드에서 select()한다면 event는?
빙고~!
댓글 달기