我正在调用FD_SET()来设置非阻塞套接字的write_fd,而select()在另一个线程中阻塞 - 问题是,即使fd准备好写入,select()仍然会阻塞。
实际上我想做的是:在另一个线程中准备要写入此套接字的数据,之后将套接字添加到write_fd中。select()线程应该能够识别并处理准备好的数据。
select()在阻塞时不会识别fd内的更改吗? 如果是这样的话,是否有类似于epoll() EPOLL_CTL_MOD而不是FD_SET()来更新集合的方法?或者唯一的方法是设置select()函数的超时时间以识别更改?
在我看来,那不是一个解决方案,因为那会很“慢”,并且会产生CPU开销...
编辑:
实际上我想做的是:在另一个线程中准备要写入此套接字的数据,之后将套接字添加到write_fd中。select()线程应该能够识别并处理准备好的数据。
select()在阻塞时不会识别fd内的更改吗? 如果是这样的话,是否有类似于epoll() EPOLL_CTL_MOD而不是FD_SET()来更新集合的方法?或者唯一的方法是设置select()函数的超时时间以识别更改?
在我看来,那不是一个解决方案,因为那会很“慢”,并且会产生CPU开销...
编辑:
// This thread is running all day long ...
static void * workman() {
FD_ZERO(&fd_read);
FD_ZERO(&fd_write);
FD_SET(socketId , &fd_read);
while(1) {
// PROBLEM Keeps blocking when box() is called
select(socketId+1, &fd_read, &fd_write, NULL, NULL);
if(FD_ISSET(socketId, &fd_read)) {
// RECIVE DATA
}
else if(FD_ISSET(socketId, &fd_write)) {
FD_CLR(socketId, &fd_write);
pthread_mutex_lock(&interface.mutex);
strncpy(conn.outBuffer, interface.buffer, strlen(interface.buffer));
interface.buffer[0] = '\0';
pthread_mutex_unlock(&interface.mutex);
// SEND DATA
}
}
return 0;
}
// This function is called within another thread on user input
int box(char *content) {
pthread_mutex_lock(&interface.mutex);
// preparing the data and write it into interface.buffer if available
pthread_mutex_unlock(&interface.mutex);
FD_SET(socketId, &fd_write);
return 0;
}