【问题标题】:How to wakeup Select call without timeout period from another thread如何从另一个线程唤醒没有超时时间的选择调用
【发布时间】:2016-04-04 10:29:11
【问题描述】:

我正在寻找在 C++ 中唤醒选择调用的解决方案,根据应用程序要求,由于使用选择系统调用的多线程,我无法设置超时。

请看下面的场景。

我想唤醒在其他线程上等待的选择系统调用。我试图从主线程向线程写入数据,但仍然无法唤醒它。

如果该线程上有空数据,我想关闭线程和套接字。

如果套接字连接从其他进程关闭,但不使用线程,则唤醒选择调用。

有人知道吗

【问题讨论】:

  • TCP中没有空数据这种东西。 UDP 中有空数据报,但您所说的似乎不太可能。不清楚你在问什么。
  • 你可以使用自我管道技巧stackoverflow.com/a/384397/2807083
  • 你也可以用signal(3)打断它。
  • @EJP 我正在开发实时应用程序,每当有新线程时,它都会保留内核资源,我想在应用程序的销毁过程正在进行时关闭所有线程,以便它会释放所有资源。
  • 您所要做的就是关闭套接字。我在您的问题中没有看到“实时”。

标签: c++ linux multithreading sockets rtos


【解决方案1】:

在最近的 Linux 上,您可以使用eventfd,在一般情况下 - 管道,用法 - 在选择器中注册管道的一侧以提高可读性以及实际的套接字,以唤醒选择器 - 只需编写一个字节到管道的另一端。或者(如果您的 libc 有它)您可以使用带有 sigmask 的 pselect 来捕获 ALRM 信号,并在需要唤醒选择器时提高该信号。在多线程应用程序中使用信号方法时要非常小心(因为“我不会使用”),因为如果做得不对,信号可能会被传递到随机线程。

【讨论】:

    【解决方案2】:

    感谢大家的宝贵建议,我可以使用link 上的参考答案解决套接字 FD 上的shutdown() 调用问题,它会将唤醒信号传递给正在等待操作的选择。我们应该只在 select 调用后关闭套接字,否则 select 将无法获得唤醒信号。

    【讨论】:

      猜你喜欢
      • 2013-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      • 2011-01-29
      相关资源
      最近更新 更多