There are two functions in epoll:
Are they thread-safe when I use the same epoll_fd?
What will happen if one thread calls epoll_wait and others call epoll_ctl at the same time?
Yes, epoll is thread-safe. Yes, you can do it.
write() is certainly thread-safe. The problem is that a partial write() could require multiple calls in order to completely write the data, and while that is "thread-safe" it could result in interleaved data.
epoll is a Linux kernel system call for a scalable I/O event notification mechanism, first introduced in version 2.5. 44 of the Linux kernel. Its function is to monitor multiple file descriptors to see whether I/O is possible on any of them.
It is thread-safe, but there isn't much documentation that explicitly states that. See here
BTW, you can also have multiple threads waiting on a single epoll_fd
, but in that case it can get a bit tricky. (I.e. you might want to use edge-triggered EPOLLET
or oneshot mode EPOLLONESHOT
. See here.)
Note: The existing accepted answer is correct, but it mentions "there isn't much documentation that explicitly states that", while epoll documentation does state it.
The manual page for epoll_wait
explicitly allows adding a file descriptor to an epoll set while it is being waited for in another thread:
Section "Notes":
While one thread is blocked in a call to epoll_wait(), it is possible for another thread to add a file descriptor to the waited-upon epoll instance. If the new file descriptor becomes ready, it will cause the epoll_wait() call to unblock.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With