我正在使用 C++ 和 pthreads 进行一些事件处理。我有一个从我定义的事件队列中读取的主线程,以及一个填充事件队列的工作线程。队列当然是线程安全的。
工作线程有一个文件描述符列表,并创建一个 epoll 系统调用来获取这些文件描述符上的事件。它使用 epoll_wait 来等待 fd 上的事件。
现在的问题。假设我想干净地终止我的应用程序,我怎样才能正确取消工作线程?epoll_wait
不是pthread(7)的取消点之一,因此它无法对pthread_cancel
.
工作线程 main() 看起来像这样
while(m_WorkerRunning) {
epoll_wait(m_EpollDescriptor, events, MAXEVENTS, -1);
//handle events and insert to queue
}
m_WorkerRunning
设置为线程启动时,true
看起来我可以m_WorkerRunning
通过从主线程设置为 false 来中断线程。问题是epoll_wait
理论上可以永远等待。
我想到的其他解决方案是:我可以等待例如 X 个时隙,而不是永远等待(-1),然后正确处理无事件情况,如果m_WorkerRunning == false
然后退出循环并干净地终止工作线程。然后主线程设置m_WorkerRunning
为 false,并休眠 X。但是我不确定这种 epoll_wait 的性能,也不确定正确的 X 是什么?500毫秒?1秒?10s?
我想听听一些有经验的建议!
更多相关信息:我正在等待事件的 fd 是设备,/dev/input
所以从技术上讲,我正在做某种输入子系统。目标操作系统是基于 ARM 架构的 Linux(最新内核)。
谢谢!