gpt4 book ai didi

c - pthread超时或取消,使用pthread_cond_timedwait,还是什么?

转载 作者:行者123 更新时间:2023-11-30 15:37:10 28 4
gpt4 key购买 nike

我有一个线程在消息队列上等待(阻塞)消息以进行处理。 轮询不是一种选择。

当某个START消息到达时,我们设置一些变量,该变量必须在给定的时间延迟后重置,或者在另一个STOP消息到达时重置。如果设置了,重复的START应该将设置时间延长给定的时间段(可以重新开始)。

与此同时,线程应该继续处理到达的其他消息。

在我看来,执行此操作的方法是生成并分离一个新的 pthread,该线程将处理超时。该线程将超时并在退出之前向父线程发送 STOP 消息,或者如果父线程收到 STOP 消息,则提前终止/取消。

我一直在阅读 pthreads 文档,但我并不完全清楚执行此操作的最佳方法:

  1. 我可以创建一个只休眠给定时间的线程,然后发送 STOP 消息,如果 STOP 则 pthread_cancel() 消息消息来得更快。文档中似乎暗示(但没有明确说明),在这种情况下,“取消”操作基本上会在 sleep 中终止线程,没有进一步的操作。

  2. 我可以创建一个使用 pthread_cond_timedwait() 等待条件的线程,如 this例子。这个看上去最“合适”,但也是最麻烦的。

  3. 与 1 类似,但 fork() 一个监视标志变量的进程,如果标志被重置,则超时或放弃。

  4. 使用SIGALARM处理程序,加上Alarm()来设置/取消设置定时信号(听起来很简单,但实践起来似乎有点不整齐,而且只能有一个闹钟)

延迟在秒范围内,精确到 ~0.1 秒就很好了。我不喜欢 pthread_cond_timedwait 使用绝对时间的方式,因为用户有可能设置时钟并使事情失去平衡(不是世界末日,但对我来说似乎不是最佳的)。

从网络上的示例中,我不清楚“pthread_cancel”或“pthread_cond_timedwait”对于分离线程是否可以干净地工作?

我不会发布我当前喜欢的选项的代码,因为它几乎是 example 的复制粘贴在选项 2 中。

最佳答案

我不明白你在烦恼什么。据我了解您的描述,计时器显然是正确的选择。

  • 使用timer_create创建一个计时器,以便在时间过去时发出信号。如果您所做的只是设置变量的开关,那么这可以在信号处理程序本身中轻松完成
  • 如果您在剩余时间内收到 STOP 消息,请使用 timer_settime 解除定时器的状态
  • 如果在定时器启动时收到第二条 START 消息,请使用 timer_gettime 获取定时器的剩余时间,添加新的时间量,然后使用 timer_settime 重置定时器
  • 使用完计时器后使用timer_delete删除计时器

alarmitimer间隔计时器不同,您不限于单个计时器。

顺便说一句,如果您使用 POSIX 消息队列,并且消息数量很少且间隔很远,那么可能值得使用 mq_notify。您可以将其设置为在将新消息放入之前为空的队列中时启动一个线程,而不是整天阻塞在 mq_receive 上,并且您只需处理任何和所有消息,直到队列再次为空并且线程结束。

关于c - pthread超时或取消,使用pthread_cond_timedwait,还是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22308388/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com