C和线程中的函数超时

C和线程中的函数超时,c,multithreading,timeout,C,Multithreading,Timeout,大家好,我有一个关于c语言超时的问题,所以我问你们 因此,我正在用C编写一个服务器应用程序,它使用POSIX线程来接受多个简单的连接,但是实现超时比我预期的要困难,因为我首先在开始行的部分中读取消息(HTTP请求),而不是在头行等中读取消息,并且我最初使用select()为了检测套接字是否已准备好读取,但如果客户端只发送起始行,服务器将继续等待标头和正文,而不会超时,因此我将读取消息的所有代码放在一个函数中,而不想对整个函数执行超时,假设函数在x秒内未返回,则调用超时函数并退出线程 [我尝试过的

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

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

[我尝试过的事情]

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

  • 提前支付。。B)

    除了让线程函数完成外,没有合适的方法来终止它


    从外部完成线程的每一次尝试都可能导致资源(主要是内存)泄漏、状态变量处于不确定状态等等。请不要这样做。从未。从外部终止线程函数的正常方法是使其侦听线程间通信的某种方式(可以是同步对象、可变变量甚至消息循环),并在必要时退出函数核心。通常情况下,如果线程在线程内的每个长时间运行操作之前循环或测试,那么您可以通过在线程的循环条件下进行单个测试来实现它


    现在,如果您在每个循环条件下存储函数start和test的时间戳/长时间运行的test ifcurrenttimestamp>timestamp+timeout,那么您可以从线程内部退出并查看;你的问题解决了。

    分享你的研究成果对每个人都有帮助。告诉我们您尝试了什么,以及为什么它不能满足您的需求。这表明你花了时间来帮助自己,它使我们避免重复显而易见的答案,最重要的是,它帮助你得到一个更具体和相关的答案!还看到我在这里没有发现问题吗?@Eregrith谢谢你的回答,编辑了帖子。@Frxstrem如果函数在x秒内没有返回,我将尝试为该函数设置一个超时。我希望调用一个处理函数,或者我的函数返回一个指示超时的sertain值。恐怕我不太理解您评论的第一部分:p,我的函数中没有使用循环,但我想我可以检查每次recv()调用后的时间!(这比使用select容易得多)非常感谢!我会将帖子标记为已解决。@亚里士多德正在检查每次
    recv()调用的时间,这会帮你解决问题。还请注意,如果您想要一个总体超时,您可以生成一个时间戳(starttime+overalltimeout)并将其传递给您的线程。