在C++中,如何销毁以类成员函数启动并正确等待epoll的线程?

问题描述 投票:0回答:1

正如问题所说,我有课。伪代码如下:

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()之前手动给自己发送一个事件呢?

c++ multithreading epoll
1个回答
0
投票

我想知道在这种情况下结束线程执行的最佳实践是什么?

告诉线程退出并然后加入它。机制由你决定。

你可以:

    添加适当的信号掩码和处理逻辑后,用信号中断
  • epoll_wait
     
    EINTR
    
    
  • 切换到使用
  • epoll_pwait
     并发送 
    that 信号
  • 为轮询添加超时并检查(适当同步的)布尔变量以查看线程是否应继续运行
  • 等等
© www.soinside.com 2019 - 2024. All rights reserved.