select() が別のスレッド内でブロックしている間に、非ブロック ソケットの write_fd を設定するために FD_SET() を呼び出しています。
私が実際にやりたいことは、別のスレッド内でこのソケットに書き込むデータを準備し、その後ソケットを write_fd に追加することです。select() スレッドはそれを認識し、準備されたデータを処理する必要があります。
ブロック中に select() は fd 内の変更を認識しませんか? はいの場合 – セットを更新するための FD_SET() の代わりに epoll() EPOLL_CTL_MOD のようなものがあります。または、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;
}