【问题标题】:Function timeouts in C and threadC和线程中的函数超时
【发布时间】:2015-06-08 14:32:41
【问题描述】:

大家好,我有一个关于 c 超时的问题,所以我问你们。

所以我正在用 C 语言制作一个服务器应用程序,它使用 POSIX 线程来接受多个简单的连接,但实现超时比我预期的要难,因为我首先阅读了部分消息(HTTP 请求),而不是标题等,等等,我最初使用 select() 来检测套接字是否已准备好读取,但是如果客户端仅发送起始行,那么服务器将继续等待标头和正文而不会超时,所以我所做的是我将读取消息的所有代码放在一个函数中,我不想为整个函数实现超时,比如如果函数在 x 秒内没有返回,则调用超时函数并退出线程......

[我尝试过的事情]

  1. 进行了多个选择调用(每个套接字读取一个),但最终导致不得不计算每个操作的剩余时间的混乱。
  2. 我实际上并没有尝试使用警报信号,因为我听说信号会影响整个过程,而不是会导致每个并行连接超时的特定线程。..

提前谢谢.. B)

【问题讨论】:

  • 分享您的研究对每个人都有帮助。告诉我们您尝试了什么以及为什么它不能满足您的需求。这表明您已经花时间尝试帮助自己,它使我们免于重复明显的答案,最重要的是它可以帮助您获得更具体和相关的答案!另见how to ask
  • 我没有在这里找到问题?
  • @Eregrith 感谢您的回复,编辑了帖子。
  • @Frxstrem 如果函数未在 x 秒内返回,我正在尝试使函数超时..

标签: c multithreading timeout


【解决方案1】:

除了让它完成之外,没有其他适当的方法可以终止线程函数。


每次从外部完成线程的尝试都可能导致资源(主要但不仅是内存)泄漏、状态变量处于不确定状态等等。请不要这样做。绝不。从外部终止一个线程函数的正常方式是让它监听一些线程间通信的方式(可以是同步对象、易失变量甚至是消息循环),然后退出必要时的功能核心。通常你会通过在线程的循环条件中进行一次测试来实现它,如果它在你的线程中的每个长时间运行的操作之前循环或测试。

现在,如果您存储函数启动的时间戳,并在每个循环条件/长时间运行的测试中进行测试,如果 currenttimestamp > timestamp + timeout,您可以从线程内部退出,瞧;你的问题解决了。

【讨论】:

  • 恐怕我不太明白你评论的第一部分:p 我没有在我的函数中使用循环,但我想我可以在每次 recv() 之后检查时间称呼! (这比使用 select 容易得多)非常感谢!我会将帖子标记为已解决。
  • @AristosMiliaressis 检查每次recv() 通话的时间将为您解决问题。另请注意,如果您想要一个整体超时,您可以生成一个时间戳(开始时间 + 整体超时)并将其传递给您的线程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-07
  • 2016-06-06
  • 2014-05-01
  • 2020-05-05
  • 2011-01-12
  • 1970-01-01
相关资源
最近更新 更多