【发布时间】:2012-02-26 21:54:04
【问题描述】:
我目前正在处理的应用程序是一个服务器,它将使用 select() 管理与客户端的连接,每次服务器接收到消息时,它都会打开一个新线程以读取套接字。在此期间,套接字的文件描述符将从集合中删除,并将在读取结束时添加。 这是代码示例
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?
如果需要互斥锁,如何避免死锁?
【问题讨论】:
标签: c multithreading