【问题标题】:C - select() - how to update the timer correctlyC - select() - 如何正确更新计时器
【发布时间】:2013-03-13 19:54:15
【问题描述】:

linux 手册指出:

The operation of select() and pselect() is identical, other than these
       three differences:

       (i)    ...

       (ii)   select() may update the timeout argument to indicate how much time
              was left.  pselect() does not change this argument.
       (iii)  ...

它说你可以更新它,但我该怎么做? 我再次调用 select(),使用相同的参数?

【问题讨论】:

  • 这是一种 linux 主义:Linux 总是具有更新结构时间戳的非标准特性。其他 unice 没有这样做,它不在 POSIX、IIRC 中。

标签: c multithreading posix


【解决方案1】:

它说你可以更新它,但我该怎么做

它没有说这样的话。它说函数可以修改它The standard 措辞略有不同:

成功完成后,select() 函数可能会修改 超时参数指向的对象

【讨论】:

  • 所以如果我用 10 秒调用 select()。当我的线程启动时超时,我无法在线程执行期间向该计时器添加几秒钟,或者将其重置为 10 秒?
  • @nickNatra 我不认为你可以。该标准没有说什么,所以这就是你应该假设的。只需将超时视为“虚假唤醒”即可。
  • @nickNatra 我看不出utimensat 对你有什么帮助。
【解决方案2】:

在调用过程中不应该修改超时结构的内容。但是,您可以停止选择,然后使用新的超时重新启动它。

通常,当您使用select 制作多线程应用程序时,您会提供一种方法来中断此调用以更新已处理文件描述符的列表,例如。例如,这可以使用套接字对来实现。套接字对的一个套接字用于控制线程,另一个总是添加到fd_set。虽然这是一个不同的主题。

【讨论】:

  • 我使用 select() 没有任何文件描述符,就像一个线程安全的计时器。
  • @nickNatra 你可以考虑使用等待函数(你不能修改等待),或者定时器(那些可以修改)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
相关资源
最近更新 更多