【问题标题】:RTOS: requesting non-sleeping task to wake up causes next call to sleep() to not sleep - is that good?RTOS:请求非睡眠任务唤醒会导致下一次调用 sleep() 不睡眠 - 这很好吗?
【发布时间】:2014-11-09 12:42:19
【问题描述】:

我正在重写现有的实时内核TNKernel;我已经使用它几年了,但我不喜欢它的许多设计决策(以及实现细节),所以我决定分叉它并享受实现我想要的东西的乐趣。有兴趣的朋友可以在project page on bitbucket阅读更多信息。

在我看来,TNKernel 有一个奇怪的特性:它有服务 tn_task_sleep(int timeout) 使当前任务进入睡眠状态,它有 tn_task_wakeup(struct TN_Task *task) 唤醒当前睡眠任务。

奇怪的是在非睡眠任务上调用tn_task_wakeup()是合法的;在这种情况下,像wakeup_request 这样的特殊标志将被设置,并且在下次调用tn_task_sleep() 时,该标志将被清除,并且任务不会休眠。

在我看来,所有这些都是完全肮脏的 hack,它可能被用作避免竞争条件问题的解决方法,或者作为信号量的 hacky 替代品。

它只是鼓励程序员采用 hacky 方法,而不是创建简单的信号量并提供适当的同步。所以,我愿意从我的项目中删除这项服务。这是摆脱它的好主意,还是我错过了一些重要的事情?为什么我们需要它?

【问题讨论】:

  • 这听起来更像是一个错误,因为文档指出如果任务尚未处于 SUSPENDED 或 WAITING_SUSPENDED 状态,则 tn_task_resume 应该返回错误。
  • @nos,哦,出于某种原因,我在我的问题中混淆了,请抱歉:当然我的意思是tn_task_wakeup(),而不是tn_task_resume()(这与暂停,不睡觉有关任务)。顺便说一下,关于tn_task_wakeup(): doc 声明:“如果任务未处于睡眠模式,则任务的唤醒请求排队并且唤醒请求计数器加 1”,但是如果您查看源代码,则该计数器的预期最大值为:1,因此它本质上是一个标志。无论如何,这在我看来是一种肮脏的黑客行为。

标签: multithreading sleep rtos wakeup


【解决方案1】:

由于没有人说我错了,我认为我是对的,并从我的内核中删除了这些奇怪的“功能”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-08
    • 2011-07-29
    • 2015-04-13
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多