현재 작업하고있는 응용 프로그램은 select()를 사용하여 클라이언트와의 연결을 관리하는 서버입니다. 서버가 메시지를 수신 할 때마다 소켓을 읽기 위해 새 스레드가 열립니다. 그 시간 동안 소켓의 파일 디스크립터는 세트로부터 제거되고, 읽기 마지막에 추가 될 것이다. 여기 코드의 샘플입니다FD_SET, FD_CLR ... 원자 적 연산입니까?
struct s_handle {
int sock;
fd_set * rdfs;
};
int main(){
...
fd_set rdfs;
...
while(1){
....
select(nb_fd,&rdfs,NULL,NULL,NULL)
for_each(peer){
if(FD_ISSET(peer->sock,&rdfs)){
struct s_handle * h = malloc(sizeof(struct s_handle));
h->sock = peer->sock;
h->rdfs = &rdfs;
FD_CLR(peer->sock,&rdfs);
pthread_create(thread,NULL,handle,(void *)&h);
}
}
...
}
...
}
void* handle(void* argss){
struct s_handle * temp = (struct s_handle *) argss;
...
FD_SET(temp->sock,temp->rdfs);
}
합니까 FD_SET, FD_ISSET 및 FD_CLR 원자 조작, 또는 내가 뮤텍스와 RDFS를 잠글 필요합니까?
뮤텍스가 필요한 경우 어떻게 교착 상태를 피할 수 있습니까?
그 스레드가 자신의'fd_set'을 가지며'select' 자체를 호출하게되면, 그 스레드는 단지 I/O를 기다려야 만합니다. 그런 다음 특정 스레드가 스케줄 될 때까지 해당 소켓에서 수행 할 수있는 작업이 없습니다. 그래서 많은 여분의 리소스를 소비하게 될 것입니다. 모든 스레드가 기다리고있을 뿐이며 '올바른'스레드를 실행하려면 추가로 많은 컨텍스트 스위치가 필요합니다. (하지만, 그가'select'를 사용하고 있다면, 그는 아마도 성능에 신경을 쓰지 않을 것입니다.) –
글을 쓸 때 나는 혼란 스럽습니다. repolling없이 그것을 종료합니다. 소켓을 읽는 스레드를 만드는 줄을 더 생각하고 있었고 연결이 닫힐 때까지 주변을 지켜 보았습니다.하지만 그가 그렇게하고있는 것처럼 보이지는 않습니다. – Dmitri