正如问题所说,我有课。伪代码如下:
class MyClass
{
MyClass()
{
epoll_fd = epoll_create(0);
/*start a thread with MyClass::threadFunc() here */
mythread = std::thread( &MyClass::threadFunc, this );
}
void threadFunc()
{
while( true )
{
int numEvents = epoll_wait( epoll_fd, ... );
// some processing here
}
}
~MyClass()
{
mythread.join();
}
std::thread mythread;
int epoll_fd;
}
int main()
{
MyClass inst;
// some processing
return 0;
}
我想让线程在构造函数中启动并在析构函数中结束。但是,该线程有一个 while 循环并等待事件。因此 join() 永远不会返回,不是吗?我想知道在这种情况下结束线程执行的最佳实践是什么?
如果我使用一个标志让 while 循环退出,它只有在 epoll_wait 返回时才会起作用。如果没有事件,那么程序就会停留在 join() 上,对吗?那么这种情况下,我是不是要在epoll监听列表中添加一个唤醒fd,并在调用join()之前手动给自己发送一个事件呢?
我想知道在这种情况下结束线程执行的最佳实践是什么?
告诉线程退出并然后加入它。机制由你决定。
你可以:
epoll_wait
EINTR
epoll_pwait
并发送that 信号